一(1):构造函数的深入理解
对于构造函数的介绍,我们之前已经了解到了很多,但是对于在类中有自定义类型,但是其构造函数又不是默认构造,而是传参的构造,那么对于这种类,我们又该怎么对其进行初始化呢?
此时,我们就可以用另一种初始化方法:初始化列表
初始化列表的使用:以‘:’开始,以‘,’进行分割。
初始化列表的本质就是类成员定义的地方!!!
所有成员都可以在初始化列表中初始化,也可以在函数体中进行初始化,那么什么情况下只可以使用初始化列表呢?
(1)const修饰的变量(const修饰的变量必须在定义的时候进行初始化)
(2)引用(引用必须在定义的时候进行初始化)
(3)自定义类型中没有默认构造,本身需要传参初始化的类
特性:在我们不写的情况下,编译器也会自动调用初始化列表,自定义成员则会去自动调用其默认构造函数,内置类型若给了缺省值,直接调给初始化列表将其进行初始化,否则不做处理。
默认调用顺序(在我们没有显式写出初始化列表情况下):初始化列表->函数体
(若自定义中没有默认构造,则直接报错)
初始化列表的初始化顺序:类成员的声明顺序就是在初始化列表中的初始化顺序,所以尽量把初始化列表中的顺序与声明顺序保持一致,以免出现下列错误。
(在用_a2的值去初始化_a1时,此时的_a2还没有被初始化,所以_a1打印出来就是一个随机值)
PS:在实际写代码时,可以用初始化列表的情况下尽量就用初始化列表
一(2)隐式类型转换
A aa2 = aa1;(拷贝构造) A aa3 = 3;(隐式类型转换)
在第二个例子中,先创建了一个临时变量,用3对其进行初始化,然后再用这个临时变量对aa3进行拷贝构造。
对于拥有多个参数的,也可以进行隐式类型转换. 例:A aa1{1,2}
如果要防止出现隐式类型转换,可以使用关键字:explicit 进行制止
二:友元
基本概念:若如果一个函数是一个类的友元,它可以直接访问该类中的所有成员(通俗理解,类有了一个朋友,这个朋友可以到类的家里来玩,可以玩类家里的东西),但是类不可以去访问友元中的成员,因为类并不是该函数的友元。
友元函数声明:friend+函数声明(一般而言,写到类的最前面)
作用:解决调用类私有成员的问题
以重载流输出<<为例,使用友元输出日期类
三:static成员
static成员存储在静态区,而static修饰的成员变量与成员函数间也有区别。
静态成员变量特点:
(1)属于所有类,所有类的成员都可以去调用它
(2)在进行初始化时,要单独地在外部对其进行初始化,因为它是存储在静态区中的
(3)不可以给它缺省值,因为它并不在对象中
实践用途:可以利用它去统计构造的次数或者被析构的次数
静态成员函数:与静态成员变量拥有的特性不同,在静态成员函数中,只可以去访问静态成员变量
(在静态成员函数中并没有隐含的this指针,所以其只可以访问静态成员变量)
四:内部类
基本概念:在一个类中,又再次定义了一个类,进行套娃
PS:内部类是当前类天生的友元!!!
五:匿名对象
基本概念:没有名字的类,生命周期只在当前这一行。