代码重用
代码重用
本篇随笔聚焦代码重用思想,以及侧重于竞赛而不是实际开发
基础代码重用
代码重用,最基础含义为代码重复使用
1. 全局函数复用
在没有学习面向对象知识之前,我们可以使用mian函数以外的函数来实现代码复用,例如下面的最大值与平均值
#include <iostream>
using namespace std;
// 全局函数1:求两个整数的最大值(竞赛反复用)
int max2(int a, int b) {
return a > b ? a : b; // 三目运算符,等价于if-else,更简洁
}
// 全局函数2:求整数的绝对值(竞赛反复用)
int abs_int(int x) {
return x < 0 ? -x : x;
}
// 主函数:调用全局函数
int main() {
// 第一次调用max2
int a = 3, b = 5;
cout << "3和5的最大值:" << max2(a, b) << endl; // 输出5
// 第二次调用max2
int c = -2, d = -8;
cout << "-2和-8的最大值:" << max2(c, d) << endl; // 输出-2
// 调用abs_int,结合max2使用(复用的叠加)
int x = -7;
cout << "-7的绝对值:" << abs_int(x) << endl; // 输出7
cout << "-7的绝对值和5的最大值:" << max2(abs_int(x), b) << endl; // 输出7
return 0;
}
2. 全局变量复用
一次定义,多次访问,修改,要求尽量加const关键字修饰
#include <iostream>
using namespace std;
// 全局变量1:数组长度(竞赛中数组长度常设为全局,避免传参)
const int N = 5; // const表示常量,值不能修改,竞赛推荐
// 全局变量2:整型数组(需要在主函数和sum_arr函数中共享)
int arr[N];
// 全局函数:求全局数组的和(直接访问全局变量arr和N,无需传参)
int sum_arr() {
int sum = 0;
for (int i = 0; i < N; i++) {
sum += arr[i];
}
return sum;
}
int main() {
// 主函数中修改全局数组arr的值
arr[0] = 1; arr[1] = 2; arr[2] = 3; arr[3] = 4; arr[4] = 5;
// 调用全局函数,直接使用全局数组的结果
cout << "数组元素的和:" << sum_arr() << endl; // 输出15
// 主函数中直接修改全局变量(若不是const)
// 比如定义int cnt = 0; 可在多个函数中累加计数
return 0;
}
类的组合(Has-A关系)
Has-A 是类与类之间的一种 “拥有 / 包含” 关系,英文直译就是 “有一个”,核心定义可以浓缩为:
A 里面有一个 B,B 是 A 的 “零件 / 组成部分
与我们高中学习的集合相似,比如你现在在看的这台电脑,如果不包含GPU,CPU等硬件,就无法运行,这就是Has-A关系
Is-A关系
即为继承的逻辑关系
两者的关系
- 组合(Has-A):能说出「A 有一个 B」→ B 是 A 的零件 / 配件,没有 B,A 还是 A,只是少了个组成部分;
- 继承(Is-A):能说出「A 是一个 B」→ A 是 B 的具体类型 / 子类,没有 B 的范畴,A 就没有存在的意义。
比如:猫是一个动物(Is-a)————电脑有一个GPU(Has-A)
代码层面的区别:
组合(Has-A)子类直接定义在主体类内,继承(Is-A)子类直接继承父类所有元素,失去子类,父类将没有意义(大多数情况)
继承的具体代码实现
#include <iostream>
using namespace std;
// 基类:Shape(图形)——抽象Is-A关系的公共逻辑
class Shape {
public:
int x, y; // 所有图形的公共属性:中心坐标
void printCenter() { cout << "中心:(" << x << "," << y << ")" << endl; }
};
// 继承语法:实现“Circle Is-A Shape”的Is-A关系
class Circle : public Shape {
public:
int radius; // 圆形专属属性
};
// 继承语法:实现“Rectangle Is-A Shape”的Is-A关系
class Rectangle : public Shape {
public:
int w, h; // 矩形专属属性:宽、高
};

浙公网安备 33010602011771号