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;
      }

    };

相关推荐
1000世界小札1 小时前
《大话数据结构》第9章精读:归并排序与快速排序完整 C++ 实现
数据结构·c++·算法
2601_956121974 小时前
背包基础篇(01、完全、分组、多重、混合)
c++·算法·动态规划
丰锋ff4 小时前
基于 Qt 的智能门禁系统(二)
开发语言·qt
fpcc4 小时前
跟我学C++中级篇——编译期的条件选择
开发语言·c++
SomeB1oody4 小时前
【RustyML入门】6.3. 并行归约
开发语言·后端·机器学习·rust·教程
mqiqe6 小时前
AgentScope Java 2.0 协议集成全景解析:A2A、AG-UI、Agent Protocol 三大开放协议实战指南
java·开发语言·ui
lzhdim6 小时前
12、JavaScript常见的内存泄露问题 - JavaScript学习系列文章
开发语言·前端·javascript·学习·ecmascript
脉动数据行情6 小时前
Java 实现台股 TWSE/TPEx 行情采集(个股 + K 线)
java·开发语言·twse·tpex·台股
爱学习的小邓同学6 小时前
Golang --- (1)第一个Golang程序
开发语言·后端·golang
zx_741484817 小时前
【Python 入门】面向对象基础:类、对象、成员变量与构造方法
开发语言·python