契子 ✨
有一道面试题:实现一个类,计算程序中创建出了多少个类对象?
相信有很多老铁一开始会不知所措,怎么统计呢?
这个时候我们可以借助 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 访问限定符的限制 |
我们学的差不多了,做道题练练手~
先介绍到这里啦~
有不对的地方请指出💞