C++面向对象静态成员

静态成员 :在定义前面加了static关键字的成员
例如:

class CRectangle{
	private:
		int w, h;
		static int nTotaArea; // 静态成员变量
		static int nTotalNumber;  
	public:
		CRectangle(int w_, int h_);
		~CRectangle();
		static void PrintTotal(); // 静态成员函数
}

普通成员变量每个对象各自一份, 静态成员变量一共就一份, 为所有对象共享

class CMyclass{
	int n;
	static int s;
};
sizeof (CMYclass) 等于 4
  1. 普通成员变量对每个对象各自一份, 而静态成员变量一共就一份
  2. 普通成员函数必须作用于某个对象,而静态成员函数并不作用于某个对象
  3. 因此静态成员可以不需要对象而进行访问

如何访问静态成员

  1. 类名::成员名
    CRectangle::PrintTotal();
  2. 对象名.成员名
    CRectangle r;
    r.PrintTotal();
  3. 指针->成员名
    CRectangle *p = &r;
    p->PrintTotal();
  4. 引用.成员名
    CRectangle & ref = r;
    int n = ref.nTotalNumber;

注意

  1. 静态成员变量本质上是全局变量, 哪怕一个对象都不存在,类的静态成员变量也存在
  2. 静态成员函数本质上是全局函数
  3. 设置静态成员这种机制的目的都是和某些类关联起来,看起来更像是一个整体,易于维护

静态成员示例
设置一个矩阵类,利用全局变量记录总数和总面积

class CRectangle{
	private:
		int w, h;
		static int nTotalArea;
		static int nTotalNumber;
	public:
		CRectangle(int w_, int h_);
		~CRectangle();
		static void PrintTotal();
};
CRectangle::CRectangle(int w_, int h_){
	w = w_;
	h = h_;
	nTotalNumber ++;
	nTotalArea += w*h;
}
CRectangle :: ~CRectangle(){
	nTotalNumber --;
	ntotalArea -= w*h;
}
void CRectangle::PrintTotal(){
	cout << nTotalNumber << "," << nTotalArea << endl;
}
int CRectangle::nTotalNumber = 0;
int CRectangle::nToalArea = 0;
// 必须提前对类中的静态成员进行初始化
int main(){
	CRectangle r1(3, 3), r2(2, 2);
	// cout << CRectangle::nTotalNumber; // wrong, 私有
	CRectangle::PrintTotal();
	return 0;
}

上述代码的缺陷
在使用CRectangle类时, 有时会调用复制构造函数生成临时隐藏的CRectangle对象, 临时对象在消亡时会调用析构函数,减少nTotalNumber 和 nTotalArea的值, 可是这些临时对象生成时却没有增加nTotalNumber和nTotalArea的值

静态成员函数中,不能访问非静态成员函数变量,也不能调用非静态成岩函数

void CRectangle::PrintTotal(){
	cout << w << "," << nTotalNumber << "," << nTotalArea << endl;
}
CRectangle::PrintTotal();
// 解释不通,w到底属于哪一个对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值