C++ 运算符重载入门:让“+”也能为自定义类型服务!

🧠 C++ 运算符重载入门:让"+"也能为自定义类型服务!

大家好!今天我们来聊聊 C++ 中一个既强大又容易被滥用的特性------运算符重载 。特别是我们最熟悉的 + 号,在 C++ 中不仅可以用于数字相加,还能让它为我们的自定义类服务!

💡 一句话理解:运算符重载就是给已有的运算符赋予新的含义,使其能作用于我们自己定义的数据类型。


🎯 为什么需要重载加号?

想象一下,你定义了一个表示人的类 Person,其中有两个属性:m_Am_B。现在你想把两个 Person 对象"加起来",比如把他们的属性分别相加,得到一个新的 Person

这时候,如果你直接写:

cpp 复制代码
Person p3 = p1 + p2;

编译器会一脸懵:"+" 是干啥的?我只知道怎么加 int、double......你这 Person 是啥?

所以,我们就需要告诉编译器:"当两个 Person 相加时,请这样做......"


✅ 成员函数方式重载 +

来看你写的 Person 类:

cpp 复制代码
class Person {
public:
    Person() {};
    Person(int a, int b)
    {
        this->m_A = a;
        this->m_B = b;
    }
    //成员函数实现 + 号运算符重载
    Person operator+(const Person& p) {
        Person temp;
        temp.m_A = this->m_A + p.m_A;
        temp.m_B = this->m_B + p.m_B;
        return temp;
    }

public:
    int m_A;
    int m_B;
};

这里通过成员函数 重载了 + 运算符。

当你写 p2 + p1 时,实际调用的是 p2.operator+(p1),把 p2 的成员和 p1 的成员分别相加,返回一个新对象。


🌍 全局函数方式(注释掉了,但你知道它存在)

你也可以用全局函数来重载(虽然当前代码中被注释了):

cpp 复制代码
//Person operator+(const Person& p1, const Person& p2) {
//    Person temp(0, 0);
//    temp.m_A = p1.m_A + p2.m_A;
//    temp.m_B = p1.m_B + p2.m_B;
//    return temp;
//}

这种方式更对称,适用于左右操作数类型不同的场景(比如 int + Person),但成员函数只能处理"左操作数是当前类对象"的情况。


🔁 运算符重载也支持函数重载!

你可能注意到了这段代码:

cpp 复制代码
//运算符重载 可以发生函数重载 
Person operator+(const Person& p2, int val)  
{
    Person temp;
    temp.m_A = p2.m_A + val;
    temp.m_B = p2.m_B + val;
    return temp;
}

这说明:运算符重载本质上还是函数 !所以它可以像普通函数一样被重载。

于是你可以同时支持:

  • Person + Person

  • Person + int

非常灵活!


🧪 完整测试代码(原样保留你的实现)

cpp 复制代码
void test() {
    Person p1(10, 10);
    Person p2(20, 20);

    //成员函数方式
    Person p3 = p2 + p1;  //相当于 p2.operaor+(p1)
    cout << "mA:" << p3.m_A << " mB:" << p3.m_B << endl;

    Person p4 = p3 + 10; //相当于 operator+(p3,10)
    cout << "mA:" << p4.m_A << " mB:" << p4.m_B << endl;
}

int main() {
    test();
    system("pause");
    return 0;
}

输出结果:

cpp 复制代码
mA:30 mB:30
mA:40 mB:40

完美!两个 Person 相加,或者 Person 加一个整数,都能按我们期望的方式工作。


⚠️ 重要提醒

总结1 :对于内置数据类型(如 intdouble 等)的运算符行为,无法改变 。你不能让 1 + 2 等于 5!
总结2不要滥用运算符重载 !重载后的语义应尽量符合直觉。比如 + 应该表示"组合"或"累加",而不是删除、打印或其他奇怪操作。


📌 小结

  • 运算符重载让自定义类型也能使用 + - * / 等符号。

  • 可通过成员函数全局函数实现。

  • 支持函数重载,可适配不同类型组合。

  • 语义清晰、符合直觉是良好重载的关键!


如果你觉得这篇推文对你有帮助,欢迎点赞、转发,让更多 C++ 初学者少走弯路!

有任何问题,也欢迎在评论区留言交流~


相关推荐
多彩电脑5 分钟前
向AIDE(安卓设备上的Android Studio)导入aar库
android·java·开发语言·androidx
江屿风15 分钟前
C++图论基础单源最短路-常规版dijkstra算法/堆优化版dijkstra算法/bellman-ford 算法/spfa 算法流食般投喂
开发语言·c++·笔记·算法·图论
摇滚侠17 分钟前
MyBatis 入门到项目实战 MyBatis 逆向工程 62
java·开发语言·mybatis
ch.ju21 分钟前
Java Programming Chapter 4——Multi-level inheritance
java·开发语言
Molesidy24 分钟前
【Linux】【C++】Linux下的C++编程以及基于GDB的VSCode的C++调试
开发语言·c++
techdashen24 分钟前
用 Rust 真正发出 Ping:FFI 类型、newtype 与 MaybeUninit
开发语言·后端·rust
塵觴葉28 分钟前
基于Lua协程的简单任务管理
开发语言·lua
liulilittle29 分钟前
甲骨文云中国大陆定向 QoS 原理及绕过解决方案
服务器·开发语言·网络·计算机网络·oracle·通信·qos
程序猿编码30 分钟前
子域猎手:一款高性能DNS枚举工具的设计与实现
linux·c++·python·c·dns
iCxhust31 分钟前
C# 生成命令行程序 将hex格式烧录程序转换成bin烧录格式
开发语言·汇编·单片机·嵌入式硬件·c#·微机原理