【C++】静态成员变量 ( 静态成员变量概念 | 静态成员变量声明 | 静态成员变量初始化 | 静态成员变量访问 | 静态成员变量生命周期 )

文章目录

一、静态成员变量概念


1、静态成员变量引入

在 C++ 类中 , 静态成员变量 又称为 静态属性 ;

静态成员归属 : 静态成员变量 是特殊的成员变量 , 是 类所有的 成员 , 而不是对象所有的成员 ;

静态成员变量 提供了 同类对象的共享机制 : 同一个类的 所有实例对象 , 都可以共享访问 想通的 静态成员变量实例 ;

2、静态成员变量声明

静态成员变量 声明 方式 :

  • 使用 static 关键字 修饰 类的 成员变量 , 那么 该成员变量 就被声明为 " 静态成员变量 " ;

  • 将 类的成员 声明为 static , 那么该类 不论 创建了多少个 实例对象 , 这些对象都会共享 该 static " 静态成员变量 " ;

  • 静态成员变量 声明 : 静态成员变量 是在 类定义时 , 在类的内部 进行 声明 ;

cpp 复制代码
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 类的 静态成员 成员变量 初始化有两种方式 :

  • 声明 并 进行初始化 : 声明类内部已经定义的 静态成员变量 , 然后进行初始化 ;
cpp 复制代码
// 在类外部初始化静态成员变量  
int Student::number = 1;
  • 只进行初始化 : 只对 类内部已定义的 静态成员变量 进行单纯的赋值 ;
cpp 复制代码
// 在函数中为 类 静态成员变量 赋值
Student::number = 2;

4、静态成员变量访问

静态成员变量访问 :

  • 使用域操作符访问 : 格式为 类名::静态成员变量名 ;
cpp 复制代码
	// 使用 域操作符 访问 类静态成员变量
	// 类名::静态成员变量名
	cout << "Student::number = " << Student::number << endl;
  • 使用类对象访问 : 格式为 对象名称.静态成员变量名
cpp 复制代码
	// 使用 对象 访问 类静态成员变量
	// 对象名称.静态成员变量名
	cout << "s.number = " << s.number << endl;

5、静态成员变量生命周期

静态成员变量 的 生命周期 就是 程序的声明周期 ;

静态成员变量 在 应用启动时 初始化 , 在 进程结束时销毁 ;

静态成员变量在多个对象之间共享 , 在 程序生命周期 之内 , 类的多个对象的 静态成员的值 是相同的 ;

二、完整代码示例


下面的代码中 :

定义了 Student 类 , 其中定义了 静态成员变量 number ;

cpp 复制代码
	// 在类内部定义静态成员
	static int number;

声明 静态成员变量 并进行初始化的代码为 int Student::number = 1;

cpp 复制代码
// 在类外部声明并初始化静态成员变量  
int Student::number = 1;

单独进行 静态成员变量 初始化 , 代码为 Student::number = 2 ;

cpp 复制代码
	// 在函数中为 类 静态成员变量 赋值
	Student::number = 2;

成员变量访问有两种方式 :

  • 使用 域操作符 访问 类静态成员变量 : 类名::静态成员变量名 ;
cpp 复制代码
	// 使用 域操作符 访问 类静态成员变量
	// 类名::静态成员变量名
	cout << "Student::number = " << Student::number << endl;
  • 使用 对象 访问 类静态成员变量 : 对象名称.静态成员变量名 ;
cpp 复制代码
	// 使用 对象 访问 类静态成员变量
	// 对象名称.静态成员变量名
	cout << "s.number = " << s.number << endl;

代码示例 :

cpp 复制代码
#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;
}

执行结果 :

cpp 复制代码
Student::number = 1
执行 Student 的构造函数
s.number = 2
请按任意键继续. . .
相关推荐
讳疾忌医丶7 小时前
深度拆解 RocksDB 内核:基于 C++17 的 FIFO 调度状态机与温度阶梯自愈设计
java·c++·算法·架构
2401_868534787 小时前
OpenStack 架构全景:八个核心组件深度拆解
c++·需求分析
软件课代表CiCi7 小时前
运行库是什么?电脑缺运行库怎么办?c++运行库缺失修复全攻略
开发语言·c++·windows·电脑·dll修复·dll丢失·运行库
蒸蒸yyyyzwd9 小时前
从面经中学到的三件事
c++·笔记
时时三省9 小时前
【时时三省】计算机c语言二级考试选择题重点
c++
ThornArmor11 小时前
重铸1996|肉体渲染:关节的裂缝:分段模型积木拼装与未成熟的 RSP 矩阵骨骼动画形变
c语言·汇编·c++·python·硬件架构·游戏机
Elsa️74613 小时前
算法一周刷题总结
c++·算法
风合星语13 小时前
2026 机器人工程实例(五):让 Allegro Hand 在 MuJoCo 中完成接触抓取——抓取状态机、稳定抬升与受控释放
c++·python·机器人·仿真
小羊没烦恼!13 小时前
Memory 记忆设计讨论:Agent Memory 的数据模型可以怎么设计
java·开发语言·前端·c++·c#
welfare96214 小时前
新号别搞:内存管理+模板初阶+STL简介
开发语言·c++