类和对象的补充
一、构造函数中的函数体赋值和初始化列表
1、函数体内赋值
函数体内赋值中的函数指的是构造函数:
编译器会在程序执行前通过构造函数,给成员变量一个合适的初始化值。
如果是初始化就会出现一个问题就是,对于初始化而言之需要一次赋初值就可以了,但如果是函数体内赋初值,是可以多次赋值的,那就不符合初始化这个概念了。
2、初始化列表
因为函数体内的赋初值,可以多次赋值,并不符合初始化这个概念,所以就有了初始化列表,当调用构造函数,成员变量赋初值走的是初始化列表那么只会执行一次,所以这样就符合了初始化的概念。
(1)、初始化列表的格式:
用分号:表示第一个成员变量开始走处死话列表
后面的变量用,逗号隔开
每个成员变量的初始值或表达式用括号()括起来
(2)、初始化列表的特性
初始化列表走的顺序和,在类中声明成员变量的顺序有关,与初始化列表的声明顺序无关;例:
(3)、初始化列表需要注意的地方
当类中有:
1、引用成员变量
2、const修饰的成员变量
3、自定义类型的成员变量,且没有默认构造函数的时候,
这三类成员变量必须放到初始化列表初始化
二、explicit关键字
1、explicit的作用
因为单参数的构造函数和第一个没有缺省值的构造函数,会隐式类型转换
如:
要是不行这个类隐式类型转换的话,就在这个类的构造函数前面加上explicit关键字就可以限制。
三、static成员
概念
被statci修饰的类成员,称为类的静态成员;用static修饰的成员变量,称为静态成员变量;用static修饰的成员函数,称为静态成员函数。注意:静态成员变量需要在类外初始化
static成员的特性
1 、静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
2、 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
3、 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
4.、静态成员函数没有隐藏的this指针,不能访问任何非静态成员
非静态成员函数:
静态成员函数:
5.、静态成员也是类的成员,受public、protected、private 访问限定符的限制
四、匿名对象
1、创建匿名对象
类名加括号:test1()
2、匿名对象的特点
1、匿名对象的生命周期只有一行,过了这一行就会调用它的析构函数
五、拷贝对象时编译器的优化
总结:要是再连续的调用构造函数和拷贝构造函数的话;
如果有构造函数编译器就会优化成构造函数
没有构造函数的,多次的拷贝构造就优化成一次拷贝构造
如果是只有构造函数和赋值重载就不会优化