类和对象 —— 形参列表、explicit、static成员

C++中的explicit详解 C++ explicit关键字详解 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式). 那么显示声明的构造函数和隐式声明的有什么区别呢? 我们来看下面的例子: class CxString // 没有使用... 阅读详情


目录

一、形参列表

1、形参列表、构造函数体内、变量声明时 赋值的区别

(1) 形参列表

(2) 构造函数体内

(3) 变量声明

2、必须放初始化列表进行初始化的三种情况

(1) 没有默认构造函数的自定义类

(2) 引用

(3) const修饰的成员变量

二、explicit关键字

三、static成员

1、静态成员的特性

2、静态成员函数的特性


一、形参列表

形参列表的作用是给成员变量赋初值,在构造函数的末尾,以一个冒号开始,变量之间以分号隔开,括号中放初始值

但是赋值的话,我们不是可以在构造函数内部对变量 “初始化” 吗,我们甚至还能在声明的时候赋值。下面就需要了解一下,形参列表赋值,和其他方式的赋值有什么区别

1、形参列表、构造函数体内、变量声明时 赋值的区别

(1) 形参列表

形参列表就算不写,编译器也会自动生成一份;有些变量尽管没有在形参列表初始化,编译的时候依然会自动补上

值得注意的是,形参列表只能初始化一次,也就是只能赋值一次

 但是下面三种情况或者类型,必须要进行初始化,而且只能在形参列表初始化

(1) 没有默认构造函数的自定义类

(2) 引用

(3) const修饰

(2) 构造函数体内

构造函数体准确说,变量并不是被初始化了,而是被再次赋值了

在进入函数体之前,会先经过形参列表,这里虽然没写,但是编译器会自动生成一份

 等到进入函数体内部,只不过是把原本的值给覆盖了

(3) 变量声明

下面这种写法乍一看是在给numbers赋初值,这种说法并不严谨,其实这是C++11引入的新特性,这是在给numbers赋缺省值

2、必须放初始化列表进行初始化的三种情况

(1) 没有默认构造函数的自定义类

上面提到,形参列表即便不写,编译器也会自动生成(如下),但是这个时候会调用默认构造函数

Animal():cat()

如果这个时候没有默认构造函数,那就必须通过形参来初始化了

Animal(Cat cat):_cat(cat)

 这个时候就会调用有参构造函数

(2) 引用

引用相当于给一个变量起别名,既然是起别名,那就必须要知道是给谁起别名,这就要求引用在初始化的时候绑定一个变量

但是为什么只能放形参列表呢??

因为一旦进入到函数体内部,那就是赋值了,而不是初始化

(3) const修饰的成员变量

和引用类似,const修饰的变量必须在声明的时候就绑定一个变量或者常量

进入到构造函数的函数体内,实际是赋值,相当于要改变 变量的值

所以只能放在形参列表初始化

二、explicit关键字

假设我们要通过有参构造函数来初始化一个对象,我们多数会通过下面这种方式来实现

对象能否通过等号'='来初始化,答案是可以的!

尽管如此,这种实现方式的可读性较差,我们不希望自己定义的类支持这种写法,所以我们可以在构造函数的前面加上 explicit关键字

三、static成员

static修饰的成员变量,称为静态成员变量;static修饰的成员函数,称为静态成员函数

==》静态成员函数/变量 属于类的一部分,但是不属于对象

1、静态成员的特性

(1)  static修饰的成员变量在 全局变量区,不属于任何实例,所以static修饰的成员变量必须在类外被初始化,而且不带static

(2) 类中的static静态数据成员拥有一块单独的存储区,而不管创建了多少个该类的对象,所有这些对象的静态数据成员都共享这一块静态存储空间

(3) 类静态成员可以使用  类名::静态成员  或者 对象.静态成员 来访问

2、静态成员函数的特性

静态成员没有隐藏的 this指针,无法访问任何非静态成员。假设有一个Person类,walk函数想要调用静态成员函数 print。

class Person{
public:
	static void print(int z) {        // 没有隐藏的this指针
        print(?, 1, 2);    // 缺少this指针
    }    

	void walk(Person* this, int x,int y) {}    // 有一个隐藏的this指针,无需我们显式传递
};

因为没有this指针,所以静态成员函数就无法调用非静态成员函数

【C++】-类和对象之初始化列表(explicit的简单介绍)(下) 讲解初始化列表,explicit的简单理解 阅读详情

相关推荐

C++初阶——类和对象(六)初始化列表、static成员、友元、内部类

C++初阶——类和对象(六)初始化列表、static成员、友元、内部类

Maple_land的博客 1201

函数的形参列表

函数在定义的时候,可以定义“形参列表”,用于接收参数!形参列表就是定义一系列的参数,可以是变量或函数指针。形参变量用于接收函数调用的时候,传递过来的数据。 这里我们先讲解形参是变量的知识,后续再讲解形参是函数指针的知识。 根据函数的定义格式如下: 返回数据类型函数名(形参列表) { 函数体 } 那么,形参列表是变量的时候,就是如同定义变量一样,如下: 返回数据类型函数名(数据类型名变量名) 如果要定义多个参数变量,定义格式如下: 返回数据类型函数名(数据类型名变量名1, 数据类...

LC的专栏 8629

InstallShield 打包 自定义安装依赖环境

用InstallShield2020打包.NetFramework4.5程序,程序需要集成Access数据库,必须安装AccessDatabaseEngine引擎,而InstallShield中自带的依赖项不包含该项,所以自定义集成了该依赖项。

zhaoziyu2020的博客 1128

Python基础

查看模块 1. 查看模块内容 (1)dir import string dir(str) (2) __all__ print(string.__all__) 2.使用__doc__属性查看文档 (1)help print( help(string . capwords) ) (2)__doc__ 3.使用一file一属性查看模块的源文件路径 >>> string. fil...

qq_41956860的博客 739

华为CNA VRM搭建(使用vmware worfstartion搭建)

华为CNA和VRM在 vmware workstation安装使用

weixin_70595351的博客 1811

SerDes硬件设计原理介绍

接收端:外部差分串行数据------线性均衡器----(CDR从数据中恢复出采样时钟)-----解串器(串行信号转并行信号)-------8B/10B的解码器或解扰器-----FIFO-----FPGA接受差分并行数据。发送端: FPGA发送差分并行数据----FIFO------8B/10B编码器或者扰码器-----串行器(并行信号转串行信号)-----均衡器(滤波)--------TX串行信号差分外发。串行器:8bit的并行数据----2bit的并行数据----1bits的串行数据。

weixin_42304393的博客 1109

Java泛型基础学习

一、什么是泛型?为什么要使用泛型? 泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。 泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型...

bemyself 2162

LSF调度实战:如何用bsub命令实现多队列资源抢占与公平调度

本文深入探讨了LSF作业调度系统的高级实战技巧,重点解析如何通过配置`lsb.queues`文件与灵活运用`bsub -R`命令,构建一套兼顾效率与公平的多队列资源抢占与调度体系。文章详细介绍了队列优先级设计、公平共享机制、资源感知调度以及抢占策略的实施,帮助集群管理员解决高优先级任务等待、资源分配不均等常见问题,实现计算资源的精细化管理和高效利用。

vvv99的博客 218

【C++】类与对象(static、explicit、友元、隐式类型转换、内部类、匿名对象)

💬 hello!各位铁子们大家好哇。今日更新了类与对象static、explicit、友元、隐式类型转换、内部类、匿名对象的内容。

qinjh_的博客 2543

AUTO-DL平台快速部署BEVFormer:Nuscenes数据集完整训练避坑指南

本文详细介绍了在AUTO-DL平台高效部署BEVFormer模型并利用Nuscenes数据集进行完整训练的实战指南。重点解析了平台数据管理、环境配置、数据集迁移解压、预处理及训练启动等全流程中的关键步骤与常见避坑技巧,帮助研究者和工程师快速复现这一前沿视觉感知模型,节省云端训练时间与成本。

weixin_29188043的博客 332

MBD-从一个示例看代码生成过程(rtw文件、TLC语言)

大概介绍了MBD代码生成流程,rtw文件、TLC语言

小胡同学的工程师学习之路 4214

【C++】类和对象(五) -- 类型转换、static成员

本文摘要: C++类型转换分为隐式转换和显式转换。隐式转换包括内置类型转换(需相关构造函数支持)和类类型间转换(需目标类提供源类参数的构造函数),可通过explicit禁用。编译器会对连续构造+拷贝构造优化为直接构造。static成员变量属于类而非对象,需类外初始化;静态成员函数无this指针,仅能访问静态成员。非静态函数可访问所有静态成员。静态成员受访问限定符限制,可通过类名或对象访问。练习示例展示了全局变量、局部变量和静态变量的构造与析构顺序规则。

小年糕的博客 1518

基于Jeecgboot3.9.0的文档管理系统(四)

基于Jeecgboot3.9.0的文档管理系统(四)

宁波阿成的博客 251

C++的魔法世界:类和对象的终章

详细介绍,C++类和对象中初始化列表、隐式类型转换、匿名对象等相关知识

sparrowfart的博客 2574

图像分割 - 使用Mask R-CNN模型在COCO数据集上进行图像分割任务

图像分割是计算机视觉领域的一个重要任务,它旨在将图像中的每个像素分类为对象或背景。Mask R-CNN是一种基于区域的卷积神经网络,可用于图像分割任务。它是Faster R-CNN的扩展,将目标检测与图像分割结合起来,能够同时检测和分割对象。在本博客中,我们将使用Mask R-CNN模型在COCO数据集上进行图像分割任务。我们将介绍如何下载和准备COCO数据集,以及如何使用Mask R-CNN模型进行训练和推理。

斌擎科技 1189

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C++类和对象(初始化列表、隐式类型转换、匿名对象、Static成员、内部类)

这三种类型的变量在定义时编译器一定要初始化,这里的自定义类型的成员变量的类中一定没有默认构造函数,但是可能有带参的构造函数。(3)初始化的顺序和类中声明成员变量的顺序有关。(4)构造函数会先运行初始化列表里的内容再走构造函数函数体里的内容二、隐式类型转换和explict2.1 单参数的隐式类型转换。

weixin_70485831的博客 1174

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

初始化列表和explicit关键字和static成员

1.每一个成员变量只能在初始化列表中出现一次。2.类中出现引用(在创建时就必须初始化了,而不是实例化时才进行初始化),const(只能进行一次的初始化3.自定义类型成员(且该类没有默认构造函数时)必须使用初始化列表进行初始化(没有默认的构造函数的自定义成员变量如果使用构造函数体进行初始化会调用它自身的拷贝构造函数,如果使用初始化列表会减少不必要的拷贝构造,提高效率4.尽量使用初始化列表进行初始化5.成员变量在类中的声明次序,就是成员变量初始化的顺序,与它在初始化列表中初始化的顺序无关。

2302_79795375的博客 734

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【C++】类和对象——友元函数和友元类的概念、初始化列表、explicit关键字、static成员

友元函数和友元类的概念、友元函数、友元类、构造函数知识补充、初始化列表、explicit关键字、static成员、static成员概念、static成员特性

Crocodile1006的博客 851

C++ 类和对象(下)

C++ 类和对象(下)

m0_64364831的博客 991

【C++】类与对象篇四

一 . 再谈构造函数 1. 构造函数体赋值 2. 初始化列表 3. explicit关键字 二 . static成员 【面试题】 三 . 友元 1. 友元函数 2. 友元类 四 . 内部类

2303_80737493的博客 1913

C++【类和对象】(再探构造函数、类型转换与static成员)

这次的分享就到这里结束了~如果有任何建议或纠正欢迎在评论区留言~也可以前往我的主页看更多好文哦(点击此处跳转到主页。

2301_80216111的博客 1208

C嘎嘎入门篇:类和对象(3)

1.无论是否显示写初始化列表,每个构造函数都有初始化列表2.无论是否在初始化列表显示初始化,每个成员都有走初始化列表进行初始化。1.C++支持内置类型隐式类型转换成类类型的对象,不过需要有相关内置类型为参数的构造函数。class wangpublic::_a(a)//通过打印来看看内置类型转换成类类型的效果_a = x._a;

effort123_的博客 1950

【C+++】C++类和对象5:C++类型转换、初始化列表与static成员

本文深入讲解C++类中三个重要但容易混淆的特性:初始化列表(成员变量定义初始化的唯一入口)、隐式类型转换(内置类型到类类型的转换及explicit关键字)、static静态成员(属于类而非对象的成员变量和函数)。文章详细解释了:初始化列表与构造函数体内赋值的本质区别、const成员和引用成员必须在初始化列表中初始化的原因、成员初始化顺序由声明顺序决定而非列表顺序、单参数构造函数引发的隐式转换及explicit的禁止作用、静态成员变量必须在类外定义初始化的规则、以及静态成员函数无法访问非静态成员的限制。

2502_91546643的博客 713

【C++】类和对象(构造函数、static成员、友元以及内部类)

定义时不添加static关键字,类中只是声明3. 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问4. 静态成员函数。

谁在夜里看海.的博客 1638

【C++】类和对象(下篇)--->再识构造函数,static成员,友元,内部类,匿名对象

本文算是补充了类和对象的一些零碎知识,主要包括了构造函数的初始化列表,explicit关键字,static成员,友元,内部类,匿名对象,拷贝对象时的一些编译器优化等等,文章里面还有例子和运行结果,有助于更好的理解。

m0_63198468的博客 665

C++类和对象(下):初始化列表、explicit关键字、友元函数、友元类

虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化, 构造函数体中的语句只能将其称为赋初值,而不能称作初始化。其中,对于引用成员变量和const修饰成员变量,必须在变量定义的时候(private中是对变量的声明)进行初始化,所以无法在函数体内进行初始化,但是可以通过初始化列表进行初始化。友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声 明,声明时需要加friend关键字。友元提供了一种突破封装的方式,有时提供了便利。

TTKunn的博客 1164
上一篇: 调用拷贝构造函数的几种情况
下一篇: 文件操作——系统调用函数open函数(含文件描述符介绍)
仲夏夜之梦~
博客等级 码龄6年 1069粉丝 476原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值