C++中静态成员【详细讲解】

1、静态成员概念

静态成员包括静态成员属性静态成员函数,提出静态成员的目的是为了数据共享问题

C++中静态成员【详细讲解】_第1张图片

2、静态成员属性

1)静态成员属性定义

静态成员属性类中所有对象共享的成员,而不是某个对象的成员,就是说明静态数据成员的存储空间不是放在每一个对象中,而是放在类公共区【全局变量区】,所以有时将静态成员属性称为类变量【只要类存在,静态成员属性就可以使用(务必注意这一点)】

回顾五大区知识:

堆区(malloc和new申请的空间) 栈区(局部变量,类中的非静态成员属性)
全局变量区(全局变量、静态局部变量、类中静态成员属性) 常量区(常量) 程序代码区(函数、类中成员函数)

2)静态成员属性基本结构

【类内显示声明,类外定义】

类内声明:static 数据类型 变量名;
类外定义:数据类型 类名::变量名 = 初值;

3)静态成员属性的特点

(1)各个对象共享静态成员属性;

(2)存储区域由栈区/堆区变为全局变量区;

(3)对静态成员属性的操作和一般数据成员一样,如果将静态成员属性定义为私有,则不能由外界访问(不能被类外访问)。

4)静态成员属性访问方式

(1)通过类进行访问;

类名::静态成员属性名 = 值;

 (2)通过类实例化的对象进行访问

对象名.静态成员属性名 = 值;

5)程序实例

实例1:

#include 
#include 

using namespace std;
class Person {
public:
	static int data;  //静态成员属性--类内显示声明
};
int Person::data = 10; //静态成员属性--类外显示定义

int main()
{
	Person::data = 20;  //通过类进行访问
	Person a, b, c; //创建三个对象
	cout << "--------------------------------" << endl;
	cout << "a.data的值:" << a.data << endl;
	cout << "b.data的值:" << b.data << endl;
	cout << "c.data的值:" << c.data << endl;
	b.data = 66;  //通过b对象来修改data的值
	cout << "--------------------------------" << endl;
	cout << "a.data的值:" << a.data << endl;
	cout << "b.data的值:" << b.data << endl;
	cout << "c.data的值:" << c.data << endl;
	cout << "--------------------------------" << endl;
	return 0;
}

  运行结果:

--------------------------------
a.data的值:20
b.data的值:20
c.data的值:20
--------------------------------
a.data的值:66
b.data的值:66
c.data的值:66
--------------------------------

结果解释:通过运行结果可以看出,a,b,c三个对象共同访问该data的值 。

实例2:

#include 
#include 

using namespace std;
class Person {
public:
	static int data;  //静态成员属性--类内显示声明
};
int Person::data = 10; //静态成员属性--类外显示定义

int main()
{
	cout << "该类的大小为:" << sizeof(class Person) << endl;
	return 0;
}

运行结果:

该类的大小为:1

结果解释:静态成员属性被编译器存放在全局变量区,它是类中的成员的,但是不影响类的大小。因此,在上面这个程序的实例中,sizeof求这个类的大小,相当于求一个空类的大小。【空类大小只有一字节(内存地址)】

3、静态成员函数

1)静态成员函数与静态成员属性类似,也属于类。【主要类存在,静态成员函数就可以使用(务必注意这一点)】。静态成员函数的声明需要使用static关键字来进行修饰。

2)静态成员函数基本结构

static 函数类型 函数名(参数列表/void)

3)静态成员函数调用方式

(1)通过类名进行相关调用。

类名::静态成员函数名(参数列表)

(2)通过对象进行调用。

对象名.静态成员函数名(参数列表)

4)程序实例

#include 
#include 

using namespace std;
class Person {
public:
	//静态成员属性
	static int data;
	//静态成员函数
	static void function(void)
	{
		cout << "这是静态成员函数!!!" << endl;
		data = 20;  //在静态成员函数中修改静态成员属性的值
	}
};
int Person::data = 10;  //初始化该静态成员属性的值

int main()
{
	cout << "静态成员属性的初始化值:" << Person::data << endl;
	Person::data = 30; //通过类来修改静态成员属性的值
	cout << "通过类修改后静态成员属性的值:" << Person::data << endl;  
	cout << "-----------------------------------" << endl;
	cout << "通过类名调用静态成员函数!!!" << endl;
	Person::function();
	cout << "通过静态成员函数来修改静态成员属性的值:" << Person::data << endl;
	cout << "-----------------------------------" << endl;
	Person a;
	cout << "通过对象调用静态成员函数!!!" << endl;
	a.function();
	cout << "a.data的值:" << a.data << endl;
	return 0;
	
}

运行结果:

静态成员属性的初始化值:10
通过类修改后静态成员属性的值:30
-----------------------------------
通过类名调用静态成员函数!!!
这是静态成员函数!!!
通过静态成员函数来修改静态成员属性的值:20
-----------------------------------
通过对象调用静态成员函数!!!
这是静态成员函数!!!
a.data的值:20

【注意:静态成员函数可以直接访问静态成员属性,不能直接访问类中的非静态成员属性,因为非静态成员属性只有对象存在时才有意义。

你可能感兴趣的:(c++,visual,studio)