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\[\] 释放。
相关推荐
草莓熊Lotso14 分钟前
【Linux网络】深入理解Linux IO多路复用:从本质到select服务器实战
linux·运维·服务器·c语言·网络·数据库·c++
selfsongs11 小时前
指针、内存管理、现代 C++ 特性
c++
吃着火锅x唱着歌13 小时前
Effective C++ 学习笔记 条款37 绝不重新定义继承而来的缺省参数值
c++·笔记·学习
2401_8414956413 小时前
【数据结构】B+树
数据结构·数据库·c++·b+树·概念·结构·操作原理
小保CPP13 小时前
OCR C++ Tesseract按行识别字符
c++·人工智能·ocr·模式识别·光学字符识别
阿米亚波14 小时前
【C++】流式数据输入处理(不完全整理)
开发语言·c++·笔记
皓月斯语15 小时前
【C++基础】三目运算符
开发语言·数据结构·c++
初願致夕霞15 小时前
C++懒汉单例设计详解
服务器·开发语言·c++
脱胎换骨-军哥16 小时前
C++分布式系统设计:从通信引擎到分布式共识
开发语言·c++·分布式
脱胎换骨-军哥16 小时前
C++零成本抽象理论深度拆解:现代C++如何在不牺牲性能的前提下提供高级语法封装
java·开发语言·c++