初始化列表
这个其实就是在构造函数自动调用的时候给它一个初始值。
它的格式就是: : 成员名(值或表达式)
注意是不需要写分号的,直接回车就好,如果还有想初始化的,那就加上一个逗号继续写就好了。
同时,每个成员只能初始化一次,不能说我初始化两遍。
有一些情况下是必须用初始化列表的
首先就是const修饰的变量,因为它只能在定义的时候赋值,而类里是声明,所以它能在初始化列表定义进一步确定了初始化列表的时候就是定义。
第二就是引用,因为引用必须指定个目标,所以如果我的类里有一个引用成员的话,那我只能在初始化列表里定义它了。
另外需要注意的是,它和缺省值是不冲突的,如果给了缺省值,我们可以把缺省值放到初始化列表里,但是不放那即使给了缺省值也没用上,此时如果函数体里没有用上缺省值的话那就是白给。所以它们两个更像是相辅相成的。因为初始化列表是成员的定义,所以不论你写不写它都会走到里面,写了就执行没写就给随机值或者0,然后再看函数体里你有没有查缺补漏,如果有就用你给的赋值或者缺省值赋值,如果没有且不是上面说的两种情况,那就是随机值或者0,如果是,那就会报错。
还有一点,如果没有合适的默认构造函数可用,那你也得写,不然也运行不了。所以能写尽量就写初始化列表。
这里即使你不写初始化列表,它也会在自动走的时候把你给的值赋进去。
Static成员
用static修饰的成员变量称为静态成员变量,它一定要在类外初始化,且它被所有类对象共享,不独属于具体对象,也不存放在对象里,存放在静态区。
用static修饰的函数叫静态成员函数,它是没有this指针的,它可以访问其他静态成员,但是不能访问非静态成员,因为没有this指针。而非静态成员函数可以访问任意静态变量和静态成员函数。
只要突破类域就可以访问静态成员,用 :: 操作符或者 . 操作符访问。
只能这样初始化
想要调用也只能这样
static int getc()
{
return _c;
}
int main()
{
cout << A::getc() << endl;
return 0;
}
用static修饰之后,它的生命周期就变成出了函数才销毁了,并不会因为某一段运行完就自动销毁。它会在局部销毁后,全局销毁前这段时间销毁
友元
前面一篇已经浅显的说过友元的基本用法,现在深入一点。
当我们在类里给了一个友元,并不意味着它成为类的一员,仅仅只是声明,同时我也可以同时在多个类里声明我的友元。
我也可以在类的任何地方声明,不受访问限定符的影响。
友元类的成员函数也可以是另一个类的友元函数。
但是友元是单向的,不具有交换性,也就是说你是我朋友,但是我不一定是你朋友。
另外,友元会增加类之间的耦合性所以不建议多用。
内部类
一个类在另一个类里面就叫内部类,但是计算外部类的大小并不会把内部类算进去,除了受到访问限定符和类域限制的影响,内部类其实就是一个独立的类,不过内部类天生是外部类的友元。
这一般是用在关系紧密的类之间的,比如我a实现就是给b用,那我就可以把a定义在b里,如果我再把它放到私有区,那就是b的专属内部类了。