C++ static 静态数据成员 静态成员函数

静态数据成员

用static修饰类中的数据成员,被称为静态数据成员。他并不依赖于对象的实例化,而依赖于类。所以静态数据成员不在构造函数中初始化,它单独进行初始化;就算对象没有实例化,他也存在。而普通数据成员依赖于对象的实例化,若对象没有实例化,它就不存在。

假设有一个Tank类

class Tank
{
public:
	Tank(char code);
	~Tank();
	void fire();
	static int getCount();//静态成员函数
private:
	static int s_iCount;//静态数据成员,该函数用来记录坦克个数
	char m_cCode;//坦克的名称
};

若对象还没有实例化,可以用  类名::静态数据成员名称 来访问

 Tank::s_iCount;

普通数据成员和静态数据成员的区别:

实例化tank之后,s_iCount的值会变化,但是他在内存中的个数仍然为1个,而m_strCode会有很多个(根据实例化了几个对象)

因此,静态数据成员只有一份

 

静态成员函数

理论:静态成员函数不能调用非静态成员函数和非静态数据成员,但是可以调用静态数据成员

原理:

还是前面的代码

static int getCount()
{
    m_strCode = '01''//错误
}

因为静态成员函数同样也不依赖于对象,所以在这个静态成员函数的参数中无this指针,那么在调用非静态数据成员m_strCode的时候,编译器无法知道调用哪一个对象的数据成员,则会编译出错。

而静态成员函数可以调用静态数据成员是因为静态数据成员在内存中就一个,不需要区分。

注:static成员函数不可以用const修饰,因为用const修饰的成员函数,实质上是const修饰的成员函数参数中隐藏的this指针,而static成员函数无this指针。

总结:

  • 静态数据成员必须单独初始化
  • 静态成员函数不能调用非静态成员函数和非静态数据成员
  • 静态数据成员只有一份,且不依赖对象而存在

代码示例

#include<iostream>
using namespace std;

class Tank
{
public:
	Tank(char code);
	~Tank();
	void fire();
	static int getCount();//静态成员函数
private:
	static int s_iCount;//静态数据成员
	char m_cCode;
};

int Tank::s_iCount = 10;//对静态数据成员初始化,在构造函数的外面进行

Tank::Tank(char code)
{
	m_cCode = code;
	s_iCount++;
	cout<<"Tank"<<endl;
}

Tank::~Tank()
{
	s_iCount--;
	cout<<"~Tank"<<endl;
}

void Tank::fire()
{
	cout<<"Tank--fire"<<endl;
}

int Tank::getCount()//在类外定义的时候,不需要在前面加static
{
	return s_iCount;
}

int main()
{
	cout<<Tank::getCount()<<endl;

	Tank *p = new Tank('A');
	cout<<Tank::getCount()<<endl;
	Tank *q = new Tank('B');
	cout<<q->getCount()<<endl;

	delete p;
	p = NULL;
	delete q;
	q = NULL;
	cout<<Tank::getCount()<<endl;

	return 0;
}

运行结果:

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值