【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
请按任意键继续. . .
相关推荐
_WndProc14 分钟前
C++ 日志输出
开发语言·c++·算法
薄荷故人_16 分钟前
从零开始的C++之旅——红黑树及其实现
数据结构·c++
m0_7482400216 分钟前
Chromium 中chrome.webRequest扩展接口定义c++
网络·c++·chrome
qq_4335545423 分钟前
C++ 面向对象编程:+号运算符重载,左移运算符重载
开发语言·c++
努力学习编程的伍大侠28 分钟前
基础排序算法
数据结构·c++·算法
yuyanjingtao1 小时前
CCF-GESP 等级考试 2023年9月认证C++四级真题解析
c++·青少年编程·gesp·csp-j/s·编程等级考试
闻缺陷则喜何志丹1 小时前
【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567
c++·算法·动态规划·力扣·图论·最短路·路径
charlie1145141912 小时前
C++ STL CookBook
开发语言·c++·stl·c++20
小林熬夜学编程2 小时前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
倔强的石头1062 小时前
【C++指南】类和对象(九):内部类
开发语言·c++