【3. C++ 运算符重载与函数重载】

本章目录:

    • 前言
    • 1. 函数重载(Function Overloading)
      • 1.1 规则
      • 1.2 示例:多种数据类型的打印
        • 示例输出:
      • 1.3 典型应用场景
    • 2. 运算符重载(Operator Overloading)
      • 2.1 规则
      • 2.2 示例:重载 `+` 计算体积
        • 示例输出:
      • 2.3 友元函数方式重载运算符
        • 示例输出:
    • 3. 函数重载与运算符重载的结合
        • 示例输出:
    • 总结


前言

在 C++ 中,我们可以使用函数重载运算符重载来提高代码的可读性和复用性。本文将带你深入理解这两个概念,并通过创新示例来展示它们的强大之处。


1. 函数重载(Function Overloading)

函数重载允许在同一作用域内定义多个同名但参数列表不同的函数。当调用重载函数时,编译器会根据传递的参数类型和数量,自动选择最匹配的函数版本

1.1 规则

  • 函数名相同,参数列表必须不同(参数的数量、类型或顺序需有区别)。
  • 不能仅凭返回类型的不同来区分重载函数
  • 重载函数通常用于提供不同类型的输入支持,使代码更具通用性。

1.2 示例:多种数据类型的打印

#include 
using namespace std;

class Printer {
public:
    void print(int num) {
        cout << "[整数] " << num << endl;
    }

    void print(double num) {
        cout << "[浮点数] " << num << endl;
    }

    void print(const string& text) {
        cout << "[字符串] " << text << endl;
    }
};

int main() {
    Printer printer;
    printer.print(42);
    printer.print(3.14159);
    printer.print("Hello, C++!");
    return 0;
}
示例输出:
[整数] 42
[浮点数] 3.14159
[字符串] Hello, C++!

1.3 典型应用场景

  • 数学运算:同一函数可接收 intdouble 类型参数。
  • 日志系统:根据数据类型格式化输出。
  • 文件 I/O:同一 write() 函数可支持字符串、整数、二进制数据等多种输入。

2. 运算符重载(Operator Overloading)

C++ 允许重载大部分运算符,以适应自定义类型的操作。例如,我们可以重载 + 运算符来实现两个对象相加

2.1 规则

  • 不能改变运算符的优先级和结合性
  • 不能改变操作数的个数(如 + 必须是二元运算,不能改为一元)。
  • 不能重载 .::sizeof?: 等特殊运算符
  • 可以通过成员函数或友元函数来实现

2.2 示例:重载 + 计算体积

#include 
using namespace std;

class Box {
private:
    double length, width, height;
public:
    Box(double l = 0, double w = 0, double h = 0) : length(l), width(w), height(h) {}

    double getVolume() const {
        return length * width * height;
    }

    Box operator+(const Box& other) const {
        return Box(length + other.length, width + other.width, height + other.height);
    }
};

int main() {
    Box box1(3, 4, 5);
    Box box2(6, 7, 8);
    Box box3 = box1 + box2;

    cout << "Box1 体积: " << box1.getVolume() << endl;
    cout << "Box2 体积: " << box2.getVolume() << endl;
    cout << "Box3 体积: " << box3.getVolume() << endl;
    return 0;
}
示例输出:
Box1 体积: 60
Box2 体积: 336
Box3 体积: 1335

2.3 友元函数方式重载运算符

除了成员函数,我们还可以使用友元函数进行重载。这种方法更适用于对称运算符,如 +- 等。

class Point {
private:
    int x, y;
public:
    Point(int x = 0, int y = 0) : x(x), y(y) {}

    friend Point operator+(const Point& p1, const Point& p2);

    void display() const {
        cout << "(" << x << ", " << y << ")" << endl;
    }
};

Point operator+(const Point& p1, const Point& p2) {
    return Point(p1.x + p2.x, p1.y + p2.y);
}

int main() {
    Point p1(2, 3), p2(5, 7);
    Point p3 = p1 + p2;
    p3.display();
    return 0;
}
示例输出:
(7, 10)

3. 函数重载与运算符重载的结合

运算符重载本质上也是函数,因此也可以进行函数重载

class Number {
public:
    int value;
    Number(int v) : value(v) {}

    Number operator+(const Number& num) {
        return Number(value + num.value);
    }

    Number operator+(int num) {
        return Number(value + num);
    }
};

int main() {
    Number n1(10), n2(20);
    Number n3 = n1 + n2;
    Number n4 = n1 + 100;

    cout << "n3: " << n3.value << endl;
    cout << "n4: " << n4.value << endl;
    return 0;
}
示例输出:
n3: 30
n4: 110

总结

  • 函数重载 提供了更灵活的接口,使相同函数名可以适应不同类型的输入。
  • 运算符重载 允许自定义对象使用类似内置数据类型的运算符,提高代码可读性。
  • 运算符重载可以通过成员函数或友元函数实现,友元函数适用于双目运算。
  • 运算符重载和函数重载可以结合使用,增强代码的扩展性和灵活性。

通过本篇博客的讲解,相信你已经掌握了 C++ 运算符重载和函数重载的核心概念及其实际应用。希望这些示例能帮助你更好地编写高效、可读性强的 C++ 代码!


你可能感兴趣的:(C++,面向对象,c++,开发语言,linux,ubuntu,c语言,vscode,人工智能)