【C++】类的static成员

1 类的static成员

问题:统计A类型创造了多少个?

方法一:全局变量(不提倡)
我们可以在A类中把通过构造的和通过拷贝的分别记录打印就好了,我们分别用不同的两个变量来进行记录

int num1 = 0;
int num2 = 0;
class A
{
public:
	A()
	{
		++num1;
	}
	A(const A& aa)
	{
		++num2;
	}
};
A Func(A a)
{
	A copy(a);
	return copy;
}
int main()
{
	A a1;
	A a2 = Func(a1);
 
	cout << num1 << endl;
	cout << num2 << endl;
 
}

注意:全局变量在一些简单的程序中不会有问题,但是在项目中可能会出现错误。如果在.h中定义,就有可能发生链接错误。并且放成全局也不利于封装性。

方法二:静态成员变量

class A
{
public:
	A()
	{
		++_count1;
	}
	A(const A& aa)
	{
		++_count2;
	}
 
	//静态成员变量属于整个类
	static int _count1;//声明
	static int _count2;
 
	int _a;
 
};
A Func(A a)
{
	A copy(a);
	return copy;
}
//定义
int A::_count1 = 0;
int A::_count2 = 0;
 
int main()
{
	A a1;
	A a2 = Func(a1);
	cout << sizeof(a1) << endl;
 
	cout << a1._count1 << endl;
	cout << a2._count1 << endl;
 
	cout << a1._count2 << endl;
	cout << a2._count2 << endl;
 
    cout << A::_count1 << endl;
	cout << A::_count1 << endl;
 
 
	return 0;
}

在这里插入图片描述
这里我们发现sizeof这个类,计算大小是不会计算静态成员的。因为静态成员为所有类对象所共享(在静态区),不属于某个具体的实例,所以不会纳入类内的计算。

其次:在类内静态成员只是声明,静态成员变量必须在类外定义,定义时不添加static关键字。

如果静态成员是私有的就需要Get()函数提供接口来访问

class A
{
public:
	A()
	{
		++_count1;
	}
	A(const A& aa)
	{
		++_count2;
	}
     
    int  GetCount1()
	{
 
		return _count1;
	}
	int  GetCount2()
	{
		return _count2;
	}
private:
 
	static int _count1;//声明
	static int _count2;
 
	int _a;
 
};
A Func(A a)
{
	A copy(a);
	return copy;
}
//定义
int A::_count1 = 0;
int A::_count2 = 0;
 
int main()
{
	A a1;
	A a2 = Func(a1);
 
	cout << a1.GetCount1() << endl;
	cout << a2.GetCount2() << endl;
 
	return 0;
}

在这里插入图片描述
我们要使用对象调用Get()函数,那假如没有对象,我们可以把函数写成静态成员函数

但是需要注意的是static成员函数没有this指针,因此不能访问非静态成员

class A
{
public:
	A()
	{
		++_count1;
	}
	A(const A& aa)
	{
		++_count2;
	}
 
 
	//成员函数也可以是静态的
	static int  GetCount1()
	{
		return _count1;
	}
	static int  GetCount2()
	{
		return _count2;
	}
private:
	//静态成员变量属于整个类
	static int _count1;//声明
	static int _count2;
 
	int _a;
 
};
A Func(A a)
{
	A copy(a);
	return copy;
}
//定义
int A::_count1 = 0;
int A::_count2 = 0;
 
int main()
{
	A a1;
	A a2 = Func(a1);
 
	cout << a1.GetCount1() << endl;
	cout << a2.GetCount2() << endl;
 
	cout << A::GetCount1() << endl;
	cout << A::GetCount2() << endl;
 
	return 0;
}

在这里插入图片描述
在这里插入图片描述
特性:

  1. 静态成员 为所有 类对象所共享 ,不属于某个具体的实例。
  2. 静态成员变量 必须在 类外定义 ,定义时不添加 static 关键字。
  3. 类静态成员即可用类名 :: 静态成员或者对象 . 静态成员来访问。
  4. 静态成员函数 没有 隐藏的 this 指针 ,不能访问任何非静态成员。
  5. 静态成员和类的普通成员一样,也有 public 、 protected 、 private3 种访问级别,也可以具有返回值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值