c++静态成员

本文详细解释了C++中静态成员的概念,包括静态成员变量的生命周期、const修饰的静态成员属性,以及静态成员函数的作用。通过实例展示了如何使用静态成员统计类对象实例的数量,强调了静态成员的共享特性和常量特性。
摘要由CSDN通过智能技术生成

目录

1、静态成员【static修饰的成员】

1.1、静态成员概述

1.2、static修饰静态成员变量

1.3、static修饰静态成员函数

注意:

2、const修饰静态成员属性

3、静态成员案例

案例1:静态成员统计类实例化对象的个数


1、静态成员【static修饰的成员】

1.1、静态成员概述

在类定义中,它的成员(成员变量、成员方法),这些成员使用关键字static修饰,称为静态成员。不管这个类创建了多少个对象,静态成员只有一份拷贝,这个拷贝被所有属于这个类的对象共享。

 注意:普通成员是每一个类中独享的,而static修饰的成员是共享的。

静态成员属于,而不是对象。

1.2、static修饰静态成员变量

静态变量,是在编译阶段就分配空间,对象还没有创建时,就已经分配空间。

静态成员变量必须在类中声明,在类外定义

静态成员变量为什么要在类外定义呢?

这是因为编译阶段不会为类开辟内存空间,只有当给类进行实例化对象的时候,才会根据类的大小开辟空间。这时候如果静态变量定义在类里面是无法开辟空间的, 而静态变量在编译阶段就比需要有空间,那这个时候就必须在类外定义。

 代码示例:

class Data {
public:
	int num; //普通成员变量
	static int data;//静态成员变量声明
};

//类外定义静态成员变量
int Data::data = 100;

void Init() {
	//data属于静态成员变量 属于类 可以通过作用域直接访问
	cout << Data::data << endl;

	Data::data = 200;
	cout << Data::data << endl;

	//data静态变量 是所有对象共享的,可以通过对象名访问
	Data ob1;
	cout << ob1.data << endl;

	Data ob2;
	cout << ob2.data << endl;

}
int main() {
	Init();
}

运行结果:

 注意:普通成员不能通过类名称访问。

1.3、static修饰静态成员函数

上述案例data静态成员变量是public修饰的,此时可以通过类作用域访问,和对象名直接访问,此时如果将data静态成员变量用private修饰,此时就不可以通过类作用域直接访问。

 

 此时发现静态成员变量被private修饰后,既不能通过类作用域直接访问,也不能通过get()函数直接调用,这个时候难道没有实例化对象就不能使用data了吗?

这时候就可以通过静态成员函数,去访问静态成员变量,因为静态成员函数也属于不属于对象。

class Data {
private:
	int num; //普通成员变量
	static int data;//静态成员变量声明
public:
	//普通函数必须通过对象调用来访问
	static int getData(void) {
		return data;
	}
};
//类外定义静态成员变量
int Data::data = 100;
void Init() {
	//1、通过类名称直接访问
	cout << Data::getData() << endl;

	//2、通过对象名访问
	Data ob;
	cout << ob.getData() << endl;
}
int main() {
	Init();
}

运行结果:

注意:

1、静态成员函数目的 操作静态成员数据。 

2、静态 成员函数不能访问非静态成员数据。

3、普通成员函数可以操作 静态成员数据和非静态成员数据。 

2、const修饰静态成员属性

如果一个类的成员,既要实现共享【static】,又要实现不可改变【const】,那就用static const修饰。

3、静态成员案例

案例1:静态成员统计类实例化对象的个数

#include<iostream>
using namespace std;
class Data {
public:
	Data() {
		cout << "无参构造" << endl;
		count++;
	}
	Data(const Data &ob) {
		cout << "构造拷贝函数" << endl;
		count++;
	}
	~Data() {
		cout << "析构函数" << endl;
		count--;
	}
	static int count;
};

int Data::count = 0;

void Init() {
	Data ob1;
	Data ob2;
	{
		Data ob3;
		cout << "对象的个数为:" << Data::count << endl;
	}
	cout << "对象的个数为:" << Data::count << endl;
}
int main() {
	Init();
	return 0;
}

运行结果:

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
C++中的静态成员函数是属于整个类的特殊成员函数。它可以通过类名直接访问,也可以通过对象名访问。静态成员函数在其函数体内只能直接访问静态成员变量和静态成员函数,而不能访问普通数据成员和普通成员函数。静态成员函数没有隐藏的this指针。\[2\] 静态成员函数可以直接引用本类中的静态成员变量,因为静态成员变量同样属于类的一部分。静态成员函数主要用于访问静态成员变量,而不访问非静态成员。\[3\] 在给出的代码示例中,类A中的静态成员函数Get_m1()和Get_m2()都是静态成员函数,它们可以直接访问静态数据成员m。Get_m1()通过类名直接访问,而Get_m2()通过对象名访问。\[1\] 总结来说,C++中的静态成员函数是属于整个类的特殊成员函数,可以通过类名直接访问,也可以通过对象名访问。它们在函数体内只能直接访问静态成员变量和静态成员函数,不能访问普通数据成员和普通成员函数。静态成员函数没有隐藏的this指针。静态成员函数主要用于访问静态成员变量。\[2\]\[3\] #### 引用[.reference_title] - *1* [C++——静态成员函数](https://blog.csdn.net/Getugly/article/details/84000806)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C++中的静态成员函数](https://blog.csdn.net/SlowIsFastLemon/article/details/103664015)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C++ 静态成员函数](https://blog.csdn.net/feng19870412/article/details/124902096)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

晚笛诶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值