前言
- 静态数据成员:是类的一部分,为类的所有实例共享(静态区)
- 非静态数据成员:类的每个实例都有一份拷贝(动态区)
1. 非静态成员函数
非静态成员函数通过对象(或对象指针)来访问,有this
指针。
非静态函数成员属于类的实例所有,所以只有在创建类的实例的时候才会分配内存,访问类的非静态函数要通过对象来实现。
2. 静态成员变量
静态成员变量是被说明为 static 的成员变量,其具有以下特征:
- 被该类所有对象共享,不属于任何一个具体的对象
- 只有一个静态数据存储空间
- 存储空间不由构造函数分配 ,必须在类外进行初始化
- 可通过类名访问,也可通过对象访问
示例:
class B
{
public:
static int si;
int i;
//B() :si(0){} //错误
//B() { si = 0; } //如果没有下面的“int B::si = 0;”,则出错
};
int B::si = 0;
int main()
{
B bb1;
cout << B::si << " " << bb1.si << endl;
// cout << bb1.i << endl; //错误:使用了未初始化的局部变量bb1
}
- 静态数据成员的访问
- 在类只能访问公有的静态数据成员,通过类名或者对象(对象指针)访问
- 类内的非静态成员函数可直接访问
static
静态数据成员,但要使用非内联函数定义,该函数定义应与静态成员初始化在同一个源程序文件
3. 静态成员函数
- 定义:被说明为
static
的成员函数,由一个类的所有对象共享 - 引入静态成员函数的目的:访问同一类中的静态数据成员,维护对象之间共享的数据
- 被调用方式
- 在类外调用
类名::静态公有成员函数名(实参表) 对象名.静态公有成员函数名(实参表)
- 在类内调用:直接调用静态成员函数
- 静态成员函数访问本类成员的权限
- 可以直接访问该类的静态数据和函数成员
- 访问非静态数据成员,必须通过参数传递方式得到对象名,再通过对象名来访问