类的静态成员与静态方法
先讲一下类的静态成员与静态成员函数。
类的静态成员作用:类对象之间共享数据。
类对象与对象之间的成员变量是相互独立的,想要共享数据,则需要静态成员与静态方法(静态方法没太多必要)。
使用静态成员注意事项:
- 静态成员不存储在对象中,存储在静态区,编译时初始化;
- 类中声明声明静态成员即可使用,不能类中初始化;
- 静态成员初始化应该在类的方法文件中(cpp文件),且在构造函数之前(也就是先初始化静态成员,定义静态方法,再定义其它方法);
- 初始化时,不带static,使用(类名::成员名)初始化;
- 不能使用参数初始化列表;
- 可以使用(对象.成员名)使用静态变量;
静态方法注意事项:
- 类中声明,不定义;
- 定义位置同静态成员;
- 静态方法内无this指针;
- 静态方法内不能调用非静态成员;
归根揭底,静态的成员、方法有这么多限制,主要是因为其是静态的,存储位置不属于类,定义/初始化早于类。
类的静态变量
没什么好讲的,就是上面的静态成员,提这个名词主要是对比静态常量。
类中常量
类中有许多方法定义常量,这是只讲一下const定义的常量。
类内常量的作用域属于类级,即该类的所有对象均具有同一个值。
需要注意的点:
- 在c++98中,const成员只能在构造函数后的初始化列表中初始化;
- 在C++11中,const成员可以在声明时就初始化;
原因:构造函数创建对象时,对象在执行构造函数函数体前(即大括号之前)被创建(即分配存储空间)。因此,调用构造函数将为对象的成员变量分配内存。然后程序流程进入到构造函数函数体(大括号中的代码),使用常规的赋值方式对成员变量进行赋值。因此,对于const数据成员,必须在执行到构造函数体之前,即创建对象(即为const变量分配内存时),进行初始化。因此,const成员不能通过普通的构造函数来初始化。
//初始化列表
class A {
private:
static int num;
static double a;
public:
A();
}
//初始化列表
A::A(): num(0), a(0.0){
...
}
类中的静态常量
为什么有了常量之后还需要静态常量?
还记得静态成员存储的位置吗?不存储在类中,所有对象共享静态成员。
所以静态常量存在的最大意义就在于,创建多个对象时,节省内存空间。
注意事项:
- 类中只有唯一的一份拷贝,数值无法修改;
- 可以在声明处初始化,也可以像static在类外初始化;