C++运算符重载的常见注意点

什么是运算符重载?

可能很多朋友不知道什么是运算符重载,因此这不是所有语言都支持的特性。

运算符一般来说是对基本数据类型进行操作,而在面向对象语言中大量用到类对象,是不能用原生运算符进行操作的。

而C++中支持了运算符的重载,其本质是一种特殊函数的调用。

常见注意点

避免全局重载和成员重载的二义性

虽然运算符重载的本质是函数的调用,但大家还是更加希望像普通运算符一样使用。

因此请避免全局重载和成员重载的二义性。

复制代码
class Node {
public:
    int x;
    Node(int x) : x(x) {
    }

public:
    Node& operator+=(const Node& rhs) {
        this->x += rhs.x;
        return *this;
    }
};

Node& operator+=(Node& lhs, const Node& rhs) {
    lhs.x += rhs.x;
    return lhs;
}

int main() {
    Node a(10);
    Node b(20);

    // ok
    a.operator+=(b);
    // ok
    operator+=(a, b);

    // error

保持与原运算符的行为一致

本条注意点可以说是最重要,最本质的一条建议。

绝大多数的建议几乎都可以回归到本条。

区分前置递增和后置递增

i++ 和 ++i 在学习语言的初阶段是必然会学到的一个知识点。很多人对此是又痛又恨。

C++ 在中用一个参数来区分前置和后置的区别。同时注意前置和后置返回的区别。

  • 前置 返回引用

  • 后置 返回副本

    class Node {
    public:
    int x;
    Node(int x) : x(x) {
    }

    public:
    // 前置递增
    // 返回引用
    Node& operator++() {
    ++this->x;
    return *this;
    }

    复制代码
      // 后置递增
      // 返回副本 添加占位符参数
      const Node operator++(int) {
          const auto copy = *this;
          // 调用前置递增
          ++(*this);
          // 返回原状态副本
          return copy;
      }

    };

相关推荐
峥嵘life10 小时前
2026华为AI码道 CodeArts 使用分享:Windows端 + 服务器CLI 实战总结
android·大数据·开发语言·python
x秀x11 小时前
sam3新手使用教程
开发语言·python
Java后端的Ai之路11 小时前
大模型LLM评估完全指南
开发语言·人工智能·python·llm·评估
别动我齐刘海11 小时前
ROS2 Jazzy + C++ 实战路线——基础学习1
c++·vscode·python·ubuntu·机器学习·自动驾驶·github
Brilliantwxx11 小时前
【STM32】 从HAL库源码深度解析I2C(源码解析+面试题)
开发语言·stm32·单片机·嵌入式硬件·架构
小白学大数据11 小时前
Python 小工具实战:用问财接口搭建金融数据采集器
开发语言·人工智能·python
泡海椒11 小时前
jquick-pdf 核心原理解析:基于 HTML 模板动态渲染 PDF 的实现逻辑
java·开发语言·pdf
j7~11 小时前
【Linux网络加餐】(篇七)网络版计算器(中):协议落地、报文分隔与完整链路
linux·c++·网络编程·tcp·报文分割·网络计算器·协议落地
青少儿编程课堂11 小时前
多源最短路与最小环(Floyd 算法图论解析)
c++·python·算法·bfs·信息学竞赛
6Hzlia11 小时前
【Classic 150 刷题计划】 LeetCode 228. 汇总区间 | C++ 锚点游标与断点检测法
c++·算法·leetcode