1.再探构造函数
1.1初始化链表
~之前实现构造函数时,初始化成员变量主要使用函数体内赋值,其实初始化还有另一种方法---初始化链表。初始化类表使用方式:以一个:开始接着是一个以 ,分隔的数据成员列表,每个成员变量后面跟着一个放在括号里面的初始值/表达式。
~每个成员变量在初始化列表中只能使用一次,语法上理解为:初始化列表可以认为是每个成员变量定义初始化的地方。
~引用成员变量,const成员变量,没有默认构造的类类型变量,必须放在初始化位置初始化
~C++11支持在成员变量声明的位置给缺省值,该缺省值主要是给没有显示在初始化列表初始化的成员使用
~尽量用初始化列表初始化,因为那些你不在初始化列表初始化的成员也会走初始化列表。若没给缺省值对于没有显示在初始化列表的内置类型成员是否初始化取决于编译器;而自定义成员会调他的默认构造函数,若无则会报错。
~初始化列表中按照成员变量在类中声明顺序进行初始化,跟成员在初始化列表出现的先后顺序无关。(建议声明顺序和初始化顺序保持一致)
2.类型转换
1.C++支持内置类型隐式类型转换为类类型对象,需要有关内置类型为参数的构造函数。
2.构造函数前加explicit就不再支持隐式类型转换
3.类类型对象也可以隐式转换,需要相应的构造函数支持
3.友元
~友元提供了一种突破访问限定符的方式,友元分为:友元函数和友元类。在函数声明/类声明的前面加上friend,并把友元声明放到一个类的里面。
~外部友元函数可访问类的私有和保护成员,友元仅仅是一种声明,她不是类的成员函数。
~友元函数可以在类定义的任何地方声明,不受访问限定符的限制。
~友元类中的成员函数都是另一个类的友元函数,都可以访问另一个类中的私有和保护成员。(友元类的关系是单项的,不具有交换性)
~友元提供便利,但会破坏封装,不建议多使用。
4.static成员
~用static修饰的成员变量,称之为静态成员变量,其一定要在类外初始化。
~静态成员变量为所有类对象所共享,不属于某个具体对象,不存在对象中,放在静态区。
~用static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针。
~静态成员函数中可以访问其他的静态成员,但不能访问非静态的,因为没有this指针。
~非静态的成员原函数可以访问任意的静态成员变量和静态成员函数。
~突破类域就可以访问静态成员,可以通过 类名::静态成员 或 对象.静态成员 来访问静态成员变量和静态成员函数。(静态成员也是类的成员,受访问限定符限制)
~静态成员变量不能在声明位置给缺省值初始化,缺省值是构造函数初始化列表的,静态成员变量不属于某个具体对象,不走构造函数初始化列表。
5.匿名对象
~用类型定义出来的对象叫作匿名对象,相比之前我们定义的 类型对象名 定义出来的的叫有名对象。
匿名对象生命周期只在当前一行,一般临时定义一个对象当前用一下即可,就可以定义匿名对象。