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\[\] 释放。
相关推荐
凡人叶枫1 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
不想写代码的星星1 小时前
std::move 根本不移动,就像老婆饼里没有老婆
c++
redaijufeng1 小时前
C++雾中风景7:闭包
c++·算法·风景
小欣加油2 小时前
leetcode287寻找重复数
数据结构·c++·算法·leetcode
思麟呀2 小时前
C++11 核心特性(三):强类型枚举、static_assert 与 std::tuple
开发语言·c++
一拳一个呆瓜2 小时前
【STL】C++程序的启动与终止
c++·stl
凡人叶枫3 小时前
Effective C++ 条款07:为多态基类声明 virtual 析构函数
linux·c语言·开发语言·c++
凡人叶枫3 小时前
Effective C++ 条款10:令 operator= 返回一个 reference to *this
java·linux·服务器·开发语言·c++·effective c++
王老师青少年编程3 小时前
2026年全国青少年信息素养大赛算法应用主题赛(C++赛项-复赛模拟卷6:文末附答案)
c++·答案·模拟卷·复赛·2026年·青少年信息素养大赛·算法应用主题赛
视觉小萌新4 小时前
C++利用libmicrohttpd制作交互网页端——C1
java·c++·交互