再谈构造函数
前几期我们把六个默认成员函数一一说明后,构造函数还有一些周边知识。
初始化列表
我们在没有了解初始化列表的时候一般都是使用构造函数初始化或者在声明哪里给予缺省值,那么为什么好药存在初始化列表呢?是因为①.有些值必须在定义的时候初始化并且②.初始化列表一个变量只能出现一次。
初始化列表的格式:
以冒号开始,逗号进行分割,先写成员变量,在用括号把参数括起来。
初始化列表是每个成员变量定义初始化的位置。有些成员必须走初始化列表:const、引用和自定义类型(有默认构造去调用默认构造,没有默认构造,就需要走初始化列表进行初始化)。
隐式类型转化
如下图,两种方式都可以,第一种方式是我们普通的对象创建,第二中这是出现了隐式类型转化,这是因为2可以构造成一个临时对象,然后在通过拷贝构造。
不希望隐式类型转化发生怎么办?在成员函数前加:explicit。
隐式类型转换支持多参数的,可以通过大括号来进行多参数的隐式类型转化。
注:初始化列表一定要按声明的顺序初始化!!不可以改变位置,某则会导致初始化数据有误。
static成员
友元函数和友元类
友元函数
注:友元函数慎用,因为相当于走后门。
当我们如果想要重载流提取和流插入操作符的时候,需要定义在类外面,是因为定义在类中就会导致参数顺序与底层实现不一致。那么为了解决这个问题,我们定义到了类外面,但是就导致私有的成员变量我们无法访问,那么这个时候我们就需要将友元函数的声明写到类中即可。
格式:friend+ 函数声明
友元函数的理解:想访问谁的私有成员变量,你就需要在它的里面写友元函数的声明。
那么我们都说慎用友元函数了,怎么解决呢?利用公有的get/set方法,可以替代友元函数。注意:友元函数没有this指针!
友元类
内部类(c++很少有,做了解即可)
在一个类里定义另一个类。(相当于套娃)
那么如果我们用szieof()操作符算一个内部类,他的大小呢?**下图的答案是8。**因为A里面成员变量没有B的成员变量。从内存角度来说,类只是声明。
内部类的特点:
①. B类会收A类的类域限制。
②.内部类天生就是外部类的友元类。即:内部类可以访问外部类的私有;但是外部类不能访问内部类。
匿名对象
区别:
特点:匿名函数的生命周期只在当前一行。(当场构造,当场析构)