目录
[三、为什么要用 static 静态成员](#三、为什么要用 static 静态成员)
[1. 类外定义静态成员变量](#1. 类外定义静态成员变量)
[2. 为什么要写 Init 函数](#2. 为什么要写 Init 函数)
[3. 用 new 创建的数组要释放](#3. 用 new 创建的数组要释放)
一、题目要求
题目大意是:
求
1 + 2 + 3 + ... + n的结果。
但是题目会限制不能使用:
1. 乘法、除法
2. for、while 循环
3. if、else、switch、三目运算符
4. 递归
二、核心思路
既然不能写循环,那就得想办法让某个操作执行 n 次。
再C++中,创建对象时自动调用构造函数。
如果创建一个对象数组:
cpp
A arr[5];
那么会创建 5 个对象,也就会调用 5 次构造函数。
三、为什么要用 static 静态成员
如果把 sum 和 i 都写成普通成员变量,那么每一个对象都有一份自己的数据,无法累加。
二静态成员变量属于整个类,所有对象共享一个数据。
所以可以定义这两个静态成员变量:
cpp
static int _i;
static int _sum;
其中:
cpp
_i 用来记录前面加到几
_sum 用来保存累加结果
每创建一个对象,就在构造函数中执行;
cpp
_sum += ++_i;
四、代码实现
cpp
#include <iostream>
using namespace std;
class Sum {
public:
Sum() {
_sum += ++_i;
}
static int GetSum() {
return _sum;
}
static void Init() {
_i = 0;
_sum = 0;
}
private:
static int _i;
static int _sum;
};
int Sum::_i = 0;
int Sum::_sum = 0;
int main() {
int n;
cin >> n;
Sum::Init();
// Sum s[n];
Sum* arr = new Sum[n];
cout << Sum::GetSum() << endl;
delete[] arr;
return 0;
}
输入:
cpp
10
运行结果:
cpp
55
五、几个注意事项
1. 类外定义静态成员变量
cpp
int Sum::_i = 0;
int Sum::_sum = 0;
静态成员变量是在类内部声明,外部定义和初始化的。
2. 为什么要写 Init 函数
cpp
static void() {
_i = 0;
_sum = 0;
}
如果 OJ 有多个测试用例,或者同一个程序多次调用这个逻辑,静态成员不会变成0。
每次计算之前最好先重置:
cpp
Sum::Init();
这样可以避免上一次计算结果影响下一次。
OJ 判题不只是测一个输入,而是会用很多测试用例,如果代码指通过了部分测试用例,说明可能存在边界情况没有处理,一定要多注意。
3. 用 new 创建的数组要释放
如果写成:
cpp
Sum* arr = new Sum[n];
这样可以输入的 n 动态创建数组。
用完之后记得释放:
cpp
delete[] arr;
六、小结
本篇主要学习了 static 静态成员的一个应用:不用循环求 1 到 n 的和。
需要记住:
- 静态成员变量属于整个类,所有对象共享一份数据;
- 创建对象时自动调用构造函数;
- 创建对象数组时会多次调用构造函数;
- 可以在构造函数中完成累加;
- 静态成员变量必须在类外定义;
- 静态变量在多次测试前要注意重置;
- 动态数组可以用 new 创建,最后用 delete\[\] 释放。