1.再探构造函数
之前我们实现构造函数时,初始化成员变量主要使用函数体赋值,构造函数初始化还有一种方法,就是初始化列表,初始化列表的使用方式是以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个“成员变量”后面跟一个放在括号中的初始值或表达式。
像这样就是初始化列表。
每个成员变量再初始化列表中只能出现一次,语法理解上初始化列表可以认为是每个成员变量初始化的地方。
初始化列表中按照成员变量再类中声明顺序进行初始化,跟成员再初始化列表出现的先后顺序无关。建议声明顺序和初始化列表顺序保持一致。
注意:当我们的成员变量里有const修饰的常量和引用的时候,就必须要初始化,否则就会报错。
因为const修饰的常量和引用在定义的时候就必须要初始化。
对于自定义类型,如果没有默认构造函数可用,也必须初始化。
2.static成员
用static修饰的成员变量,称之为静态成员变量,静态成员变量一定要在类外进行初始化。
静态成员变量为所有类对象共享,不属于某个具体的对象,不存在对象中,存放在静态区。
用static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针。
静态成员函数中可以访问其它的静态成员,但是不能访问非静态的,因为没有this指针。
非静态的成员函数,可以访问任意 静态成员变量和静态成员函数。
静态成员也是类的成员,受public ,protected,private访问限定符的限制。
3.友元
友元提供了一种突破类访问限定符封装的方式,友元分为:友元函数和友元类,在函数声明或者类声明的前面加上friend,并且把友元放到一个类里面。
外部友元函数课访问类的私有和保护成员,友元函数仅仅是一种声明,他不是类的成员函数。
友元函数可以在类定义的任何地方进行声明,不受类访问限定符的限制。
一个函数可以是多个类的友元函数。
友元类中的成员函数都可以是另一个类的友元函数,都可以访问另一个类中的私有和保护成员。
友元类的关系是单向的,不具有交换性,比如A是B类的友元,但B不是A的友元。
友元关系不能传递,比如A是B的友元,B是C的友元,但A不是C的友元。
4.内部类
如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,跟定义在全局相比,它只是受外部类类域限制和访问限定符,所以外部类的对象中不包含内部类。
内部类默认是外部类的友元类。