C++学习笔记28:静态成员应用:不用循环求1到n的和

目录

一、题目要求

二、核心思路

[三、为什么要用 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 的和。

需要记住:

  1. 静态成员变量属于整个类,所有对象共享一份数据;
  2. 创建对象时自动调用构造函数;
  3. 创建对象数组时会多次调用构造函数;
  4. 可以在构造函数中完成累加;
  5. 静态成员变量必须在类外定义;
  6. 静态变量在多次测试前要注意重置;
  7. 动态数组可以用 new 创建,最后用 delete\[\] 释放。
相关推荐
VL——MOESR4 小时前
【LuoguP1967】货车运输【生成树】【倍增】
c++·算法·题解·倍增·生成树
草莓熊Lotso4 小时前
【Linux网络】从0手写Reactor反应堆(二):完善核心细节——ET非阻塞读写、分层架构与回调机制
linux·运维·服务器·网络·c++·tcp/ip·架构
cvby4 小时前
C++哈希
c++·哈希算法·散列表
世事如云有卷舒5 小时前
GoogTest测试框架
c++·测试
hy.z_7775 小时前
【C++】9. Vector
开发语言·c++
我能坚持多久6 小时前
优选算法——专题一双指针(上):附四道例题详解
c++·学习·算法
Tim_106 小时前
【C++】023、移动语义&深拷贝
开发语言·c++·算法
ShineWinsu6 小时前
对于C++中unordered_map的详细介绍
数据结构·c++·算法·面试·stl·哈希表·unordered_map
东东最爱敲键盘6 小时前
day3.c++函数与预处理 string
c++·算法
djjjx.6 小时前
【 C++ 】stack、queue、优先级队列、仿函数、容器适配器
开发语言·c++