代码重用

代码重用

本篇随笔聚焦代码重用思想,以及侧重于竞赛而不是实际开发

基础代码重用

代码重用,最基础含义为代码重复使用

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关系

即为继承的逻辑关系

两者的关系

  1. 组合(Has-A):能说出「A 有一个 B」→ B 是 A 的零件 / 配件,没有 B,A 还是 A,只是少了个组成部分;
  2. 继承(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; // 矩形专属属性:宽、高
};
posted @ 2026-02-05 16:35  努力的小xu  阅读(4)  评论(0)    收藏  举报