一、静态成员变量概念
1、静态成员变量引入
在 C 类中 , 静态成员变量 又称为 静态属性 ;
静态成员归属 : 静态成员变量 是特殊的成员变量 , 是 类所有的 成员 , 而不是对象所有的成员 ;
静态成员变量 提供了 同类对象的共享机制 : 同一个类的 所有实例对象 , 都可以共享访问 想通的 静态成员变量实例 ;
2、静态成员变量声明
静态成员变量 声明 方式 :
- 使用 static 关键字 修饰 类的 成员变量 , 那么 该成员变量 就被声明为 " 静态成员变量 " ;
- 将 类的成员 声明为 static , 那么该类 不论 创建了多少个 实例对象 , 这些对象都会共享 该 static " 静态成员变量 " ;
- 静态成员变量 声明 : 静态成员变量 是在 类定义时 , 在类的内部 进行 声明 ;
class Student
{
public:
// 带参构造函数
Student(int age, int height)
{
m_age = age;
m_height = height;
cout << "执行 Student 的构造函数" << endl;
}
~Student()
{
cout << "执行 Student 的析构函数" << endl;
}
public:
int m_age; // 年龄
int m_height; // 身高
// 在类内部定义静态成员
static int number;
};
3、静态成员变量初始化
静态成员变量 初始化 : 静态成员变量 是在 类使用时 , 在类的外部 进行 初始化 ;
Student 类的 静态成员 成员变量 初始化有两种方式 :
- 声明 并 进行初始化 : 声明类内部已经定义的 静态成员变量 , 然后进行初始化 ;
// 在类外部初始化静态成员变量
int Student::number = 1;
- 只进行初始化 : 只对 类内部已定义的 静态成员变量 进行单纯的赋值 ;
// 在函数中为 类 静态成员变量 赋值
Student::number = 2;
4、静态成员变量访问
静态成员变量访问 :
- 使用域操作符访问 : 格式为
类名::静态成员变量名
;
// 使用 域操作符 访问 类静态成员变量
// 类名::静态成员变量名
cout << "Student::number = " << Student::number << endl;
- 使用类对象访问 : 格式为
对象名称.静态成员变量名
// 使用 对象 访问 类静态成员变量
// 对象名称.静态成员变量名
cout << "s.number = " << s.number << endl;
5、静态成员变量生命周期
静态成员变量 的 生命周期 就是 程序的声明周期 ;
静态成员变量 在 应用启动时 初始化 , 在 进程结束时销毁 ;
静态成员变量在多个对象之间共享 , 在 程序生命周期 之内 , 类的多个对象的 静态成员的值 是相同的 ;
二、完整代码示例
下面的代码中 :
定义了 Student 类 , 其中定义了 静态成员变量 number ;
代码语言:javascript复制 // 在类内部定义静态成员
static int number;
声明 静态成员变量 并进行初始化的代码为 int Student::number = 1;
代码语言:javascript复制// 在类外部声明并初始化静态成员变量
int Student::number = 1;
单独进行 静态成员变量 初始化 , 代码为 Student::number = 2 ;
代码语言:javascript复制 // 在函数中为 类 静态成员变量 赋值
Student::number = 2;
成员变量访问有两种方式 :
- 使用 域操作符 访问 类静态成员变量 :
类名::静态成员变量名
;
// 使用 域操作符 访问 类静态成员变量
// 类名::静态成员变量名
cout << "Student::number = " << Student::number << endl;
- 使用 对象 访问 类静态成员变量 :
对象名称.静态成员变量名
;
// 使用 对象 访问 类静态成员变量
// 对象名称.静态成员变量名
cout << "s.number = " << s.number << endl;
代码示例 :
代码语言:javascript复制#include "iostream"
using namespace std;
class Student
{
public:
// 带参构造函数
Student(int age, int height)
{
m_age = age;
m_height = height;
cout << "执行 Student 的构造函数" << endl;
}
~Student()
{
cout << "执行 Student 的析构函数" << endl;
}
public:
int m_age; // 年龄
int m_height; // 身高
// 在类内部定义静态成员
static int number;
};
// 在类外部初始化静态成员变量
int Student::number = 1;
int main() {
// 使用 域操作符 访问 类静态成员变量
// 类名::静态成员变量名
cout << "Student::number = " << Student::number << endl;
// 在函数中为 类 静态成员变量 赋值
Student::number = 2;
// 创建 Student 类型对象
Student s(10, 150);
// 使用 对象 访问 类静态成员变量
// 对象名称.静态成员变量名
cout << "s.number = " << s.number << endl;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
执行结果 :
代码语言:javascript复制Student::number = 1
执行 Student 的构造函数
s.number = 2
请按任意键继续. . .