【C/C++】类成员进阶——类中静态成员static

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


一、静态成员

静态成员需要使用static关键字进行修饰

【c语言】static静态变量详解

	static int a;
	static void fun(){}

二、静态成员变量

CTest类中定义静态成员变量:

#include <iostream>
using namespace std;
class CTest
{
public:
	int m_a;
	static int m_b;
	static long long m_c;
};

在构造函数中进行初始化:

CTest()
	{
		m_a = 1;
		m_b = 2;	//初始化?? 赋值
		m_c = 3;
	}

但是在主函数中使用静态成员变量m_bm_c时,出现报错:

在这里插入图片描述

此时的静态成员变量m_bm_c并未真正的被初始化,在构造函数中仅是为其赋值

静态成员变量需要在类外进行定义并且初始化

在这里插入图片描述

1.静态成员变量属于类

对一个空类只定义静态成员变量,再输出类和对象的字节大小

#include <iostream>
using namespace std;
class CTest
{
public:
	static int m_b;
	static long long m_c;
	CTest()
	{
		m_b = 2;	//初始化?? 赋值
		m_c = 3;
	}
};
//类外 定义以及初始化
int CTest::m_b = 2;
long long CTest::m_c = 3;
int main()
{
	CTest tst;
	cout << sizeof(tst) << "    " << sizeof(CTest) << endl;
	return 0;
}

在这里插入图片描述

输出结果都为1,仅为占位的大小

因此静态成员变量是属于类的,在编译期就存在

2.静态成员变量一个类中只会存在一份

创建第二个对象tst2再对类中成员进行取地址操作:

在这里插入图片描述

可以看出:

静态成员变量一个类中只会存在一份

3.静态成员变量存在与否和是否定义对象无关

不通过对象,通过类名作用域也可调用类中的静态成员变量:

在这里插入图片描述
因此静态成员变量存在与否和是否定义对象无关

4.多个对象共享一份静态成员变量

静态成员变量一个类中只会存在一份,对其中一个对象的静态变量值进行修改,另一个也会随之改变:

在这里插入图片描述

静态static成员属性

  • 属于类,编译期存在,一个类中只会存在一份,多个对象共享这一份静态成员

  • 存在与否和是否定义对象无关,在构造函数中不能对其初始化(赋值)

  • 静态成员属性需要在类外进行初始化,格式:类型 类名 类名作用域 ,给定初始值


三、静态成员函数

1.静态成员函数的定义

	//普通函数
	void fun(/*	CTest* const this */)
	{
		cout << /* this-> */m_a << "    " << m_b << endl;
	}
	//静态函数
	static void funstatic()
	{
		//...
	}

与静态成员变量相同,静态成员函数也 属于类,编译期存在,一个类中只会存在一份,多个对象共享这一份静态成员函数

2.静态成员函数的使用

在静态成员函数中调用非静态变量m_a和静态变量m_b

	static void funstatic()
	{
		cout << m_a << "    " << m_b << endl;
		cout << m_a << "    " << CTest::m_b << endl;
	}

其中,m_a不允许被使用:

而静态成员变量m_b却可以正常使用
在这里插入图片描述

这是因为 静态成员函数只能访问静态的成员,使用不了普通成员

	static void funstatic2()
	{
		//fun();		//error
		funstatic();	//ok
	}

同样也访问不了普通成员函数,只能使用静态成员函数

在主函数中使用时,可以通过对象调用

与静态成员变量相同,也可以不通过对象调用,使用类名作用域直接使用:

	CTest tst;
	tst.fun();

	CTest::funstatic2();
	tst.funstatic();

3.静态成员函数没有this指针

this指针是指向调用该成员函数的类对象的指针

CTest* const this

静态成员函数不依赖于任何类的对象,而是和类本身相关,因此没有this指针

普通成员函数与静态成员函数的区别

  • 静态成员函数 没有隐藏的this指针

  • 在静态的成员函数中,只能使用静态的成员,在普通成员函数中都能使用

  • 静态成员函数可以不通过对象调用,普通函数必须通过对象调用

  • 使用:

    1.通过对象

    2.类名作用域直接使用


本文全部代码:

#include <iostream>
using namespace std;
class CTest
{
public:
	int m_a;
	static int m_b;
	static long long m_c;
	CTest()
	{
		m_a = 1;
		m_b = 2;	//初始化?? 赋值
		m_c = 3;
	}
	void fun(/*	CTest* const this */)
	{
		cout << /* this-> */m_a << "    " << m_b << endl;
	}

	//静态函数
	static void funstatic()
	{
		/*cout << m_a << "    " << m_b << endl;
		cout << m_a << "    " << CTest::m_b << endl;*/
	}
	static void funstatic2()
	{
		//fun();		//error
		funstatic();	//ok
	}
};
//类外 定义以及初始化
int CTest::m_b = 2;
long long CTest::m_c = 3;

int main()
{

	CTest tst;

	cout << tst.m_a <<"  " << tst.m_b <<"  " << tst.m_c << endl;
	cout << sizeof(tst) << "    " << sizeof(CTest) << endl;
	CTest tst2;
	cout << &tst.m_a << "    " << &tst2.m_a << endl;
	cout << &tst.m_b << "    " << &tst2.m_b << endl;

	
	//---------不通过对象---------
	cout << CTest::m_c << endl;

	//------共享-------
	tst.m_b = 20;
	cout << tst2.m_b << endl;

	
	tst.fun();

	CTest::funstatic2();
	tst.funstatic();

	return 0;
}

在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天喜Studio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值