从 C 向 C++ 进阶系列导航
1. 静态成员变量
静态成员变量为特殊的成员变量,存储在静态存储区,被所有类对象共用,不为任意对象私有,因此类对象的大小不包含静态成员变量。定义方式比较特殊,需要在类内部声明为:static type varname;
,然后在全局作用域内进行初始化:type classname::varname = initvalue;
。
- 示例:
class Test
{
private:
static int m_Var; // 声明
}
int Test::m_Var = 0; // 定义
在程序中,可以使用“类::变量”的方式直接使用公有的静态成员变量而无需通过类的方式。而私有的静态成员变量可实现安全的多个对象之间的数据共享,因为此时的静态成员变量只能在类的成员函数内使用。
- 实验:
class Test
{
private:
static int pr_var;
public:
static int pu_var;
void print(void)
{
cout << "pr_var = " << pr_var << ", "
<< "pu_var = " << pu_var << endl;
}
};
int Test::pu_var = 0; // 初始化
int Test::pr_var = 0; // 初始化
int main()
{
Test::pu_var = 6;
cout << "Test::pu_var = " << Test::pu_var << endl; // Test::pu_var = 6
// Test::pr_var = 7; // error: ‘int Test::pr_var’ is private
Test obj;
obj.print(); // pr_var = 0, pu_var = 6
// obj.pr_var = 5; // error: ‘int Test::pr_var’ is private
return 0;
}
2. 静态成员函数
为了管理静态成员变量,C++ 提供了静态成员函数,提供对外接口。静态成员函数是类的特殊成员函数,被所有类对象共用,因此无隐藏的 this 指针。在函数声明时,只需在类内使用 static 修饰,在类外的实现中无需加上 static 修饰。
- 示例:
class Test
{
public:
static void fun(void){};
}
void Test::fun(void)
{
...
}
在程序中,可通过“类::函数”的方式直接调用静态成员函数而无需通过对象的方式。静态成员函数只能访问静态成员变量,无法访问普通的成员变量,具有更高的安全性。
- 静态成员函数与普通成员函数对比
静态成员函数 | 普通成员函数 | |
---|---|---|
所有对象共用 | yes | yes |
this 指针 | no | yes |
访问普通成员变量 | no | yes |
访问静态成员变量 | yes | yes |
通过类名调用 | yes | no |
通过对象调用 | yes | yes |
- 实验:
class Test
{
private:
static int pr_var;
int pr_var;
public:
static int pu_var;
static void print(void)
{
// cout << "pr_var = " << pr_var << endl; // error: invalid use of member ‘Test::pr_var’ in static member function
cout << "pr_var = " << pr_var
<< ", pu_var = " << pu_var << endl;
}
};
int Test::pu_var = 0;
int Test::pr_var = 0;
int main()
{
Test::pu_var = 6;
Test::print(); // pr_var = 0, pu_var = 6
return 0;
}