一、类型转换
1.1 类型转化特点
- C++支持内置类型隐式类型转换为类类型对象,需要有相关内置类型为参数的构造函数。
- 构造函数前面加explicit就不再支持隐式类型转换。
- 类类型的对象之间也可以隐式转换,需要相应的构造函数支持
内置类型转换为类类型对象:
分析:2构造一个A的临时对象, 再用这个临时对象拷贝构造a。但是编译器遇到连续构造+拷贝构造会直接优化为直接构造
类类型的对象之间的转化:
分析:a钩爪一个B的临时对象,在用这个临时对象拷贝构造b,编译器直接优化为直接构造。
二、static成员
2.1 static 成员特点
- 用static修饰的成员变量,称之为静态成员变量,静态成员变量一定要在类外进行初始化。
- 静态成员变量为所有类对象所共享,不属于某个具体的对象,不存在对象中,存放在静态区。
- 用static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针。
- 静态成员函数中可以访问其他的静态成员,但是不能访问非静态的,因为没有this指针。
- 非静态的成员函数,可以访问任意的静态成员变量和静态成员函数。
- 突破类域就可以访问静态成员,可以通过类名::静态成员或者对象.静态成员来访问静态变量和静态成员函数。
- 静态成员也是类的成员,受public、protected、privated访问限定符的限制。静态成员变量不能在声明位置给缺省值初始化,因为缺省值是个构造函数初始化列表的,静态成员变量不属于某个对象,不走构造函数初始化列表。
三、内部类
3.1 内部类特点
- 如果一个类定义在另一个类的内部,这个内部类就叫内部类。内部类是一个独立的类,跟定义在全局相比,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包p含内部类。
- 内部类默认是外部类的友元类,但是外部类不是内部类的友元函数
- 内部类本质也是一种封装。当A类跟B类精密相关,A类实现的意义就是给B使用的,可以考虑A设计为B的内部类,如果放到private/protected位置,那么A就是B的专属内部类,其他地方都用不了。
四、匿名对象
4.1 匿名对象特点
- 用类型(实参)定义出来的对象叫做匿名对象,相比我们定义的类型对象(实参)定义出来的叫做有名对象
- 匿名对象生命周期只在当前一行,一般临时定义一个对象当前用一下即可,就可以定义匿名对象
4.2 使用场景:
1.能引用,const引用会延长匿名对象的声明周期,匿名对象跟着引用走
2. 单纯想调用函数
3. 作为缺省参数
五、对象拷贝时的编译器优化
5.1 特点
- 现代编译器会为了尽可能提高程序的效率,在不影响正确性的情况下会尽可能减少一些传参和传返回值的过程中可以省略的拷贝
- 如何优化C++标准并没有严格规定,各个编译器会根据情况自行处理。当前主流的相对新一点的编译器对于连续一个表达式步骤中的连续拷贝会进行合并优化,有些更新更激进的编译器还会进行跨行跨表达式合并优化
如图所示,再不优化的时候 返回值是先拷贝构造给临时变量,在拷贝构造给aa2,
优化一代,省略了这个临时变量,直接拷贝钩爪给aa2。
优化二代,直接对aa2构造,而aa是aa2的引用