0
点赞
收藏
分享

微信扫一扫

【C++程序员的自我修炼】如何统计类中创建对象的个数

外贸达人小峻先森 7分钟前 阅读 0
c++

契子 

有一道面试题:实现一个类,计算程序中创建出了多少个类对象?

相信有很多老铁一开始会不知所措,怎么统计呢?

这个时候我们可以借助 static成员 来解决~


static成员

 举个栗子~

#include<iostream>
#include<cstdlib>
using namespace std;

class A
{
public:
	A()
		:_a(0)
	{}
	static int GetCount()
	{
		return _count;
	}
private:
	int _a;
	static int _count;
};

int A::_count= 0;

static成员变量的定义

有老铁会问 _count 能在初始化列表、构造内部初始化吗?

我们这里来看一下 :

因为 static 在静态区而不在对象中,所以不走初始化列表、构造内部

这里也不能给缺省值,因为缺省值走的是初始化列表

static成员 变量只能在类外初始化  

<1>总结:静态成员变量必须在类外定义,类中只是声明

接下来我们来计算一下这个大小是多少呢?

cout << sizeof(A) << endl;

我们发现 A类 的大小是 4 ,也就是不算 static成员 的大小

<2>总结:静态成员变量尽管声明在类中,但是位置却在静态区所以不计入类的大小

static成员函数的特点

除了静态成员变量还有静态成员函数

	static int GetCount()
	{
		return _count;
	}

静态成员函数有什么特征呢?

没有 this 指针,只能访问静态成员

接下来我们来看看怎么统计一个类创建了多少个对象

#include<iostream>
#include<cstdlib>
using namespace std;

class A
{
public:
	A()
	{
		_count++;
	}
	A(const A& a)
	{
		_count++;
	}
	static int GetCount()
	{
		return _count;
	}
private:
	static int _count;
};

int A::_count= 0;

int main()
{
	A a;
	cout << A::GetCount() << endl;
	A a1, a2;
	A a3(a1);
	cout << A::GetCount() << endl;
	system("pause");
	return 0;
}

因为我们的对象不是构造出来就是拷贝构造出来,我们只需让 _count 在这两个函数内部自增即可

所以结果是符合要求的~

还有一个问题我们来看:下面这段代码创建了多少个对象?

A Func()
{
	A a1;
	return a1;
}

int main()
{
	Func();
	cout << A::GetCount() << endl;
	system("pause");
	return 0;
}

答案是 2 个,因为第一次用构造创建了一个对象,第二次用拷贝构造了一个临时对象返回

与我们的传值传参差不多,形参是实参的临时拷贝,所以这个时候创建了两个对象

注意:但是有些编译器觉得两次构造太麻烦会优化成直接构造,也就是只创建一次 

static成员的特征

静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
静态成员变量必须在类外定义,定义时不添加 static 关键字,类中只是声明
类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
静态成员函数没有隐藏的 this 指针,不能访问任何非静态成员
静态成员也是类的成员,受public、protected、private 访问限定符的限制 

我们学的差不多了,做道题练练手~

 ​​​​​​​

先介绍到这里啦~

有不对的地方请指出💞

举报

相关推荐

0 条评论