Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【C++】静态成员变量 ( 静态成员变量概念 | 静态成员变量声明 | 静态成员变量初始化 | 静态成员变量访问 | 静态成员变量生命周期 )

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

作者头像
韩曙亮
发布于 2023-10-15 09:16:03
发布于 2023-10-15 09:16:03
2.3K01
代码可运行
举报
运行总次数:1
代码可运行

一、静态成员变量概念

1、静态成员变量引入

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

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

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

2、静态成员变量声明

静态成员变量 声明 方式 :

  • 使用 static 关键字 修饰 类的 成员变量 , 那么 该成员变量 就被声明为 " 静态成员变量 " ;
  • 将 类的成员 声明为 static , 那么该类 不论 创建了多少个 实例对象 , 这些对象都会共享 该 static " 静态成员变量 " ;
  • 静态成员变量 声明 : 静态成员变量 是在 类定义时 , 在类的内部 进行 声明 ;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 类的 静态成员 成员变量 初始化有两种方式 :

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

4、静态成员变量访问

静态成员变量访问 :

  • 使用域操作符访问 : 格式为 类名::静态成员变量名 ;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	// 使用 域操作符 访问 类静态成员变量
	// 类名::静态成员变量名
	cout << "Student::number = " << Student::number << endl;
  • 使用类对象访问 : 格式为 对象名称.静态成员变量名
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	// 使用 对象 访问 类静态成员变量
	// 对象名称.静态成员变量名
	cout << "s.number = " << s.number << endl;

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

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

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

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

二、完整代码示例

下面的代码中 :

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	// 在类内部定义静态成员
	static int number;

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 在类外部声明并初始化静态成员变量  
int Student::number = 1;

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	// 在函数中为 类 静态成员变量 赋值
	Student::number = 2;

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

  • 使用 域操作符 访问 类静态成员变量 : 类名::静态成员变量名 ;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	// 使用 域操作符 访问 类静态成员变量
	// 类名::静态成员变量名
	cout << "Student::number = " << Student::number << endl;
  • 使用 对象 访问 类静态成员变量 : 对象名称.静态成员变量名 ;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	// 使用 对象 访问 类静态成员变量
	// 对象名称.静态成员变量名
	cout << "s.number = " << s.number << endl;

代码示例 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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
代码运行次数:0
运行
AI代码解释
复制
Student::number = 1
执行 Student 的构造函数
s.number = 2
请按任意键继续. . .
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-09-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【IT领域新生必看】深入了解Java中的静态成员变量和实例成员变量:初学者的全方位指南
在Java编程中,变量是存储数据的基本单元。根据变量的定义位置和作用范围,Java中的变量可以分为静态成员变量和实例成员变量。理解这两种变量的区别和使用场景,是掌握Java编程的重要一步。本篇文章将详细介绍静态成员变量和实例成员变量的定义、用法及其区别,帮助你全面理解这些重要概念。
E绵绵
2024/07/12
2890
【c++】继承学习(二):探索 C++ 中派生类的默认机制与静态成员共享
派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用
用户11029103
2024/05/06
1840
【c++】继承学习(二):探索 C++ 中派生类的默认机制与静态成员共享
从零开始学C++之对象的使用(一):static 成员变量、static 成员函数、类/对象的大小
该文章介绍了static关键字在C++中的使用,主要包括static成员变量、static成员函数以及类/对象大小的计算。static成员变量是类的静态成员变量,可以通过类名直接访问,可以避免重复定义和静态链接库等问题。static成员函数是类的成员函数,可以在类外定义和实现,具有静态绑定和链接特点。类/对象大小的计算需要考虑类的成员变量和成员函数的存储空间,虚函数和虚继承等因素也会影响类的大小。
s1mba
2017/12/28
1.3K0
【C++】泛型编程 ⑫ ( 类模板 static 关键字 | 类模板 static 静态成员 | 类模板使用流程 )
在博客 【C++】泛型编程 ⑨ ( 类模板的运算符重载 - 函数声明 和 函数实现 写在同一个类中 | 类模板 的 外部友元函数问题 ) 中实现了第一种情况 , 类模板 的 函数声明 与 函数实现 都写在同一个类中 , 也就是没有分开进行编码 ;
韩曙亮
2023/11/23
3570
【C++】泛型编程 ⑫ ( 类模板 static 关键字 | 类模板 static 静态成员 | 类模板使用流程 )
【C++】深入探索类和对象:初始化列表及其static成员与友元
构造函数作用:在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。
是店小二呀
2024/08/10
1430
【C++】深入探索类和对象:初始化列表及其static成员与友元
C++之静态成员变量和静态成员函数学习总结
平时我们在写类的时候,类中的成员变量,我们一般是通过对象名来访问public成员变量的,一般private(私有)的成员变量,对象是不能直接访问的;同时我们要明白每个对象的成员变量都是专属的,而且成员变量是不能在对象之间共享的,这就是专属性。下面我们来做一个小的程序需求来慢慢引出静态成员变量:
用户6280468
2022/03/21
6690
C++ static静态成员
1. 静态成员变量本质上是全局变量,哪怕一个对象都不存在,类的静态成员变量也存在;
小林coding
2020/03/31
6240
C/C++ 类与构造析构等知识
构造/析构 函数: 构造函数与类名相同,没有返回值,不写void,可以发生重载,可以有参数
王瑞MVP
2022/12/28
4650
【C++】静态成员函数 ( 静态成员函数概念 | 静态成员函数声明 | 静态成员函数访问 | 静态成员函数只能访问静态成员 )
静态成员函数归属 : 在 C++ 类中 , 静态成员函数 是一种 特殊的函数 , 该函数属于类 , 而不是属于 类实例对象 ;
韩曙亮
2023/10/15
2.1K0
【C++】静态成员函数 ( 静态成员函数概念 | 静态成员函数声明 | 静态成员函数访问 | 静态成员函数只能访问静态成员 )
C++之类和对象的使用(三)
对象数组 如果构造函数只有一个参数,在定义数组时可以直接在等号后面的花括号内提供。Student stud[3]={90,92,01};//合法 如果构造函数有多个参数,则不能用在定义时直接所提供所有实参的方法。 但可以如下定义: //构造函数有三个参数:学号,年龄,成绩 Student stud[3]{ Student(1000,19,22); Student(1001,19,22); Student(1002,19,22); };   对象指针 指向对象的指针 class Box {public:
互联网金融打杂
2018/04/03
9100
C++之类和对象的使用(三)
C++深拷贝与浅拷贝,初始化列表,对象成员,静态成员相关分析
使用new创建堆区数据,需要人为释放,new出来的东西是等到整个进程结束了才会自动释放。如果这个对象已经销毁,而这个类里没有析构函数却恰恰有个指针,自动释放的是栈区的变量,而不是堆区的,那么这个地址就没有指针指向它,就造成了内存泄漏。
CtrlX
2022/08/10
9201
C++深拷贝与浅拷贝,初始化列表,对象成员,静态成员相关分析
c++之静态成员
静态成员是指成员变量和成员函数前加上关键字static。 静态成员分为:静态成员变量、静态成员函数; 静态成员变量: 所有对象共享同一份数据 在编译阶段分配内存 类内声明,类外初始化 静态成员函数: 所有对象共享同一个函数 静态成员函数只能访问静态成员变量 #include<iostream> using namespace std; class Person{ public: //类内声明,静态成员变量也是有访问权限的 static int m_a; static void fun
西西嘛呦
2020/08/26
4100
掌握C++中static关键字的多种使用场景
在最开始C中引入了static关键字可以用于修饰变量和函数,后来由于C++引入了class的概念,现在static可以修饰的对象分为以下5种:
小万哥
2023/05/07
3580
掌握C++中static关键字的多种使用场景
C++ | 对象的初始化和清理
今天来分享一下C++中对象的初始化和清理。主要是介绍构造函数和析构函数,另外也会讲一下列表初始化和静态成员这些。本节内容主要参考自黑马程序员:https://www.bilibili.com/video/BV1et411b73Z
飞哥
2020/08/05
1.6K0
C++:静态成员与友元
我们在开发中会发现,有一些属性是所有对象所共有的,比如:学生总人数,链表头指针,尾指针等,这些数据成员没有必要和对象进行关联,它们更需要被所有对象所共享,而不是在每个对象中都对其重复进行操作。如果将其放在全局变量中,那么 C++ 的封装性将受到影响,静态成员案例见以下程序片段
字节星球Henry
2021/08/09
7400
C++:08---成员变量初始化方式
成员变量初始化有三种方式: 在构造函数体内赋值初始化 在自定义的公有函数体中赋值初始化(一般用于成员变量的初始化) 在构造函数的成员初始化列表初始化 一、构造函数体内初始化 说明:在构造函数体内的初始化方式,本质是是为成员变量赋值,而不是真正意义上的初始化,这点要特别注意!(下面介绍成员初始化列表时会有演示案例对比说明) class Cperson { private: int m_age; float m_height; char* m_name; public: Cperson(int age,floa
用户3479834
2021/02/03
4890
【C++】static关键字及其修饰的静态成员变量/函数详解
全局(静态)存储区:分为data段和bass段。data段(全局初始化区)存放初始化的全局变量和静态变量;bass段(全局未初始化区)存放未初始化的全局变量和静态变量。程序运行结束时自动释放。其中bass段在程序执行之前会被系统自动清0,所以未初始化的全局变量和静态变量在程序执行之前已经为0。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。
修修修也
2024/04/01
3.2K0
【C++】static关键字及其修饰的静态成员变量/函数详解
c++ 静态函数_c语言if结构格式
1、对象与对象之间的成员变量是相互独立的.要想共用数据,则需要使用静态成员或静态方法
全栈程序员站长
2022/11/15
8390
C++类和对象(5)static修饰的静态成员变量&函数
我们自己定义一个类,使用这个类创建对象,我们应该如何判断在这个程序执行的过程中,创建了多少个对象,有几个对象是正在使用的。
阑梦清川
2025/02/24
2080
C++类和对象(5)static修饰的静态成员变量&函数
C++ 类的静态成员
我们可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。 静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零。我们不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化,如下面的实例所示。
用户7272142
2023/10/19
3990
推荐阅读
相关推荐
【IT领域新生必看】深入了解Java中的静态成员变量和实例成员变量:初学者的全方位指南
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验