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\[\] 释放。
相关推荐
见过夏天7 小时前
C++ 基础入门完全指南
c++
用户805533698032 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
BadBadBad__AK2 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境3 天前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
卷无止境3 天前
OpenMPI、MPICH 与 OpenMP:关系、核心概念与架构全解
c++·后端
郝学胜_神的一滴4 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
卷无止境6 天前
C++ 的Eigen 库全解析
c++
卷无止境6 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端
郝学胜_神的一滴6 天前
CMake 27:缓存变量的特性、语法、类型与实操全解
c++·cmake
博客18008 天前
酷宝的使用方法,超好用的免费界面库,C++、MFC可用
c++·mfc·界面库·库来帮·酷宝