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

1、静态成员概念

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

2、静态成员属性

1)静态成员属性定义

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

回顾五大区知识:

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

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

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

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

3)静态成员属性的特点

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

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

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

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

(1)通过类进行访问;

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

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

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

5)程序实例

实例1:

#include <iostream>
#include <string>

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 <iostream>
#include <string>

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 <iostream>
#include <string>

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

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当一个成员被声明为静态时,它被称为静态成员静态成员是与类关联的,而不是与类的特定实例关联的。因此,静态成员不依赖于类的任何实例,即使类没有实例,静态成员也存在。 静态成员具有以下特点: 1. 静态成员属于类,而不是属于类的任何特定实例。 2. 静态成员不需要实例化类就可以访问。 3. 静态成员只有在类定义的范围内初始化一次。 4. 静态成员可以被类的所有实例共享。 5. 静态成员可以通过类名或实例名访问。 6. 静态成员不能访问非静态成员,因为它们不属于特定的实例。 7. 静态成员可以是公共的,私有的或受保护的。 在C++静态成员可以是静态数据成员和静态函数成员。静态数据成员是类的成员,其值与类的所有实例无关,而静态函数成员是与类关联的函数,其不依赖于类的任何实例。 静态数据成员的声明方式为: ```cpp class MyClass { static int myStaticMember; }; ``` 静态函数成员的声明方式为: ```cpp class MyClass { static int myStaticFunction(); }; ``` 静态成员可以在类的定义之外初始化,例如: ```cpp int MyClass::myStaticMember = 0; int MyClass::myStaticFunction() { return myStaticMember; } ``` 如果静态成员定义在类的头文件,则需要在定义处初始化静态成员静态成员可以通过作用域解析运算符“::”来访问,例如: ```cpp MyClass::myStaticMember; MyClass::myStaticFunction(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值