山中何事
松花酿酒
春水煎茶
目录
契子 ✨
有一道面试题:实现一个类,计算程序中创建出了多少个类对象?
相信有很多老铁一开始会不知所措,怎么统计呢?
这个时候我们可以借助 static成员 来解决~
static成员
概念
声明为 static 的类成员称为类的静态成员,用 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 访问限定符的限制 |
我们学的差不多了,做道题练练手~
求1+2+3+...+n
题目链接:求1+2+3+...+n
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
数据范围: 0<n≤200
进阶: 空间复杂度 O(1) ,时间复杂度 O(n)示例1:
输入
5
输出
15
示例2:
输入
1
输出
1
思路:
使用静态成员:
设置静态成员变量 N 和 _count,在构造函数中进行累加运算 创建一个大小为 n 的对象数组,在创建的时候会自动调用 n 次构造函数,即实现了 n 次累加运算
最后调用静态成员函数返回结构即可
代码展示:
class Count { public: Count() { _count += N; N++; } static int Getcount() { return _count; } private: static int _count; static int N; }; int Count::_count = 0; int Count::N = 1; class Solution { public: int Sum_Solution(int n) { Count arr[n]; return Count::Getcount(); } };
先介绍到这里啦~
有不对的地方请指出💞