类与对象
- 一.再谈构造函数
- 1.初始化列表(构造函数的一部分)
- 2.explicit关键字
- 二.static成员
- 三.友元
- 1.友元函数
- 2.友元类
- 四.内部类
- 五.匿名对象
- 六.再次理解类与对象
一.再谈构造函数
1.初始化列表(构造函数的一部分)
我们可以直接在函数体内赋值,前面几篇博客都是用的这种方法,但实际上还有一种初始化列表赋值。
接下来对几种必须进行列表初始化的情况进行说明。
const和引用成员变量
为什么不能初始化呢?因为const和引用的特征就是必须在定义时进行初始化。
那么成员在哪个位置进行的初始化呢?其实就是在初始化列表的位置。
自定义类型成员
自定义类型在初始化时会自动进行默认构造,那么如果没有默认构造怎么办呢?(注意:默认构造不单指编译器默认生成的构造函数,也包括自己写的但不需要传参的构造函数)
例如下面有一个自定义类型A,但我们自己写了构造函数并且需要传参,也就是说它没有默认构造函数时怎么办呢?
所以没有默认构造函数的话,我们必须在初始化列表进行显示调用构造函数。
一个缺陷
这里我们给引用初始化为ref,而ref又是一个局部变量,出了作用域就会被销毁,所以我们还得将代码修改一下。
一个缺陷
为什么这里会出现随机值呢?成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。
2.explicit关键字
给d1进行赋值除了常规的,还可以直接使用等号。
这里Date d1=2022,实际上是进行了隐式类型转换。int类型被转换为了Data类型。而我们有没有办法阻止这种隐式类型转换呢?那就得用explicit关键词了。
二.static成员
下面来看一下计算机创建了多少个类的对象
三.友元
友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多 用。
友元分为:友元函数和友元类
1.友元函数
友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声 明,声明时需要加friend关键字。
1.友元函数可访问类的私有和保护成员,但不是类的成员函数
2.友元函数不能用const修饰
3.友元函数可以在类定义的任何地方声明,不受类访问限定符限制
4.一个函数可以是多个类的友元函数
5.友元函数的调用与普通函数的调用原理相同
2.友元类
友元函数是让一个函数成为你的朋友,而友元类是让一个类成为你的朋友。
例如,下面Data类就是Time类的友元类,那么Date就可以任意访问Time里的成员
四.内部类
这个类的大小为什么是4呢?因为前面说过static修饰的成员不存在类里,只是在类里声明,而定义在类外面。而这个内部类也并不占空间,它也仅仅是一个声明。内部类是外部类的友元并且如果不想让人访问这个内部类就可以把这个内部类放在私有里。
五.匿名对象
那么匿名对象有什么用呢?可以看看下面的代码。
匿名对象有个特点,就是生命周期只在当前行。如果只想调用一次函数那么就可以使用匿名。
特例