2026/2/20 17:33:09
网站建设
项目流程
做消防哪些网站找工作,网站建设的几个阶段,自己做视频的网站吗,站长工具问答网站#x1f9e0; C 运算符重载入门#xff1a;让“”也能为自定义类型服务#xff01;大家好#xff01;今天我们来聊聊 C 中一个既强大又容易被滥用的特性——运算符重载。特别是我们最熟悉的 号#xff0c;在 C 中不仅可以用于数字相加#xff0c;还能让它为我们的自定义… C 运算符重载入门让“”也能为自定义类型服务大家好今天我们来聊聊 C 中一个既强大又容易被滥用的特性——运算符重载。特别是我们最熟悉的号在 C 中不仅可以用于数字相加还能让它为我们的自定义类服务一句话理解运算符重载就是给已有的运算符赋予新的含义使其能作用于我们自己定义的数据类型。 为什么需要重载加号想象一下你定义了一个表示人的类Person其中有两个属性m_A和m_B。现在你想把两个Person对象“加起来”比如把他们的属性分别相加得到一个新的Person。这时候如果你直接写Person p3 p1 p2;编译器会一脸懵“” 是干啥的我只知道怎么加 int、double……你这 Person 是啥所以我们就需要告诉编译器“当两个Person相加时请这样做……”✅ 成员函数方式重载来看你写的Person类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的成员分别相加返回一个新对象。 全局函数方式注释掉了但你知道它存在你也可以用全局函数来重载虽然当前代码中被注释了//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但成员函数只能处理“左操作数是当前类对象”的情况。 运算符重载也支持函数重载你可能注意到了这段代码//运算符重载 可以发生函数重载 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 PersonPerson int非常灵活 完整测试代码原样保留你的实现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; }输出结果mA:30 mB:30 mA:40 mB:40完美两个Person相加或者Person加一个整数都能按我们期望的方式工作。⚠️ 重要提醒总结1对于内置数据类型如int、double等的运算符行为无法改变。你不能让1 2等于 5总结2不要滥用运算符重载重载后的语义应尽量符合直觉。比如应该表示“组合”或“累加”而不是删除、打印或其他奇怪操作。 小结运算符重载让自定义类型也能使用 - * /等符号。可通过成员函数或全局函数实现。支持函数重载可适配不同类型组合。语义清晰、符合直觉是良好重载的关键如果你觉得这篇推文对你有帮助欢迎点赞、转发让更多 C 初学者少走弯路有任何问题也欢迎在评论区留言交流