【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
请按任意键继续. . .
相关推荐
Cinema KI1 小时前
内存管理这一块
c++
1白天的黑夜11 小时前
哈希表-49.字母异位词分组-力扣(LeetCode)
c++·leetcode·哈希表
深耕AI2 小时前
【MFC典型类和函数:CString的字符串魔法与Afx全局函数的便利店】
c++·mfc
怀旧,2 小时前
【C++】19. 封装红⿊树实现set和map
linux·c++·算法
凯子坚持 c2 小时前
Redis核心通用命令深度解析:结合C++ redis-plus-plus 实战指南
c++·redis·log4j
神里流~霜灭2 小时前
(C++)数据结构初阶(顺序表的实现)
linux·c语言·数据结构·c++·算法·顺序表·单链表
John_ToDebug3 小时前
从源码视角全面解析 Chrome UI 布局系统及 Views 框架的定制化实现方法与实践经验
c++·chrome·架构
愚润求学3 小时前
【贪心算法】day7
c++·算法·leetcode·贪心算法
深耕AI3 小时前
【MFC简介:从基础概念到实际应用】
c++·mfc
六点半8883 小时前
【C++】C++11 篇二
开发语言·c++