静态成员属于类所有,不属于对象。但为所有对象所共享。
因为静态成员不属于对象所有,所以在对象初始化的时候,不会为静态成员分配内存空间。
故在类中,静态成员只是做了一个引用性的声明,必须在类外进行正式的声明。
声明格式: 类型 类名::静态成员名; // 也可以赋初始值,对于静态成员, 系统会自动赋予初始值。如:
class A
{
private:
static int id;
}
int A::id;
访问: A::id
2. 静态方法,同样为类所有,为对象所共享,类可以直接调用,而不必声明对象来调用
调用格式: 类名::方法
注意,在静态方法中,可以访问静态成员和静态成员方法。但是不能访问非静态成员变量,
因为此时对象还没有生成,何来的成员变量?
如果要在静态方法中使用成员变量,可以使用别名。如:
static void display(类名 &对象别名p)
{p.xx=...};
3. 类的友元。
C++为解决效率的需要,提出了一个友元的概念,
只要把某个类外函数声明为该类的友元,就可以直接访问类中的任何成员(public,protect,private)
1)将普通函数声明为类的友元
2)将某个类的成员函数声明为本类的友元函数
3)将某个类声明为本类的友元类
友元都声明在类中,只是说明友元函数有权访问类的所有成员,但并不表明友元函数和友元类属于该类的成员。
友元声明不受权限的限制,声明在哪一行都行。
友元用friend修饰,一般使用对象的别名作为参数
4. 类的嵌套
要有初始化列表,初始化顺序跟初始化列表无关,只于对象声明的顺序有关。
如果没有写,则调用默认的构造函数。
如:class C
{
private:
A a;
B b; // A,B 都是类名
public:
C(int a, int b, int c):a(a),b(b) {...}; // 调用 A(int i)构造方法初始化 a
}