12.5 友元和static成员
友元
友元是类或者函数,声明于类定义内部,且不受类访问控制影响。
需先定义包含友元的类(定义此类的时候需要先声明授予友元权限的类)。
在使用友元的类中,不必预先声明友元类或函数
友元的声明使得其作用范围扩散的该类定义的外围作用域
比如X类有个Y类的友元,则在X定义的外围作用域中的Z类也可以使用Y而不必声明:
1 class X;
2
3 class Y {
4
5 };
6
7 class X {
8 friend class Y;
9 friend void f();
10 };
11
12 class Z {
13 Y *p;
14 void g() { ::f(); }
15 };
2
3 class Y {
4
5 };
6
7 class X {
8 friend class Y;
9 friend void f();
10 };
11
12 class Z {
13 Y *p;
14 void g() { ::f(); }
15 };
static
static函数无this形参,不属于某个对象,不能访问非static成员,不能是const函数的和虚函数
在类外部定义static函数或初始化static成员时无需使用"static"关键字
可以通过::操作符直接访问
static数据成员必须在类定义外部定义(否则编译能过,链接不行)。const static数据成员在类定义体中初始化时(只有静态常量才可以在类定义中初始化),仍必须在外部定义。
// define and initialize static class member
int ClassType::staticMem = staticFunc();
// 这里staticFunc无需使用限定符,因为staticMem的定义就表示是在类定义作用域中
// 所以即使staticFunc()是私有的也无妨
int ClassType::staticMem = staticFunc();
// 这里staticFunc无需使用限定符,因为staticMem的定义就表示是在类定义作用域中
// 所以即使staticFunc()是私有的也无妨