1.初始化列表
1.为什么有初始化列表,它的作用?
->初始化列表,是构造函数初始化的另一种形式。
->在语法上面理解,初始化列表可以认定为是每个成员变量定义初始化的地方.
->引用成员变量,const成员变量,没有默认构造的类类型变量,他们三者必须要在自身定义时初始化。所以要将他们放在初始化列表的位置进行初始化,否则会编译报错。
2.使用形式
->以冒号作为开始标志,每个初始化以逗号作为分隔符号,每个“成员”变量后有个括号,用来放初始值或表达式。
3.C++11支持成员变量声明的位置给缺省值,主要是用于,该成员变量没有在初始化列表初始化使用的。
4.尽量使用初始化列表,因为尽管你不走初始化列表,也会走初始化列表。因为假设该成员在声明时给了缺省值,那么初始化列表会调用他的缺省值进行初始化,如果没有给缺省值,对于类置类型的成员是否初始化取决于编译器,而自定义类型,会去调用它的默认构造,如果没有相应的默认构造,又没有初始化列表。就会编译报错。
5.初始化列表的顺序,其实是按照成员变量声明的顺序来进行的。跟成员变量在初始列表出现的先后顺序无关。
例如以下例子:
2.类型转换
1.C++支持内置类型隐式类型转换为类类型对象,需要有相关类型作为构造函数的参数。
2.构造函数前面加explicit就不再支持隐式类型转换。
3.static成员
1.static修饰的成员变量,称为静态成员变量。!!!静态成员变量一定要在类外面进行初始化。
2.类静态成员变量属于所有的类对象,不属于某个具体的对象,不存在对象中,存在静态区。
3..类静态成员也是类的成员,受类域限制,也受访问限定符的限制(public protected,private)
4.static修饰成员函数,成为静态成员函数,静态成员函数没有this指针。
5.静态成员函数可以访问静态成员,不能访问非静态的,因为没有this指针。
6.非静态的成员函数可以任意的访问静态成员函数和静态成员。
7.突破类域可以访问静态成员 ,可以通过类名::静态成员或对象.静态成员来访问静态成员和静态成员函数
8.静态成员不能在声明时给缺省值,因为缺省值是给构造函数初始化列表使用的,而静态成员不属于某一对象,所以不走初始化列表,所以也就不能给缺省值。
例题:
答案选择:E,B
4.友元
5.内部类
1.什么是内部类?
->一个类的定义是在另一个类的内部,!!!内部类是一个独立的类,与定义在全局的相比,他只受到类域和访问限定符的限制,所以外部类定义的对象不包括内部类。
2.内部类默认是外部类的友元类。
3.内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使⽤,那么可以考虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其 他地⽅都⽤不了。
6.匿名对象
1.用类型定义出来的是对象叫做匿名对象,而类型名+对象名定义出来的是有名对象。
2.匿名对象的生命周期只在当前那一行,一般临时定义一个对象当前用一下就可以定义临时对象。
7.对象拷贝时的编译器优化
1.现代编译器会为了尽可能提⾼程序的效率,在不影响正确性的情况下会尽可能减少⼀些传参和传参过程中可以省略的拷⻉。
2.如何优化C++标准并没有严格规定,各个编译器会根据情况⾃⾏处理。当前主流的相对新⼀点的编译器对于连续⼀个表达式步骤中的连续拷⻉会进⾏合并优化,有些更新更"激进"的编译还会进⾏跨⾏跨表达式的合并优化。
今日份鸡汤:“如果没有天赋,那就一直重复!”
今天的学习就到此结束啦!谢谢大家支持!