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

    };

相关推荐
弹简特3 小时前
【Java项目-轻聊】07-实现主页面模块
java·开发语言
wuminyu3 小时前
Java锁机制之轻量级锁判断与尝试逻辑源码剖析
java·linux·c语言·jvm·c++
Thecozzy3 小时前
写文档教 AI 用代码
开发语言·python
Hanniel3 小时前
装饰器 (中): 进阶篇,解锁框架级玩法
开发语言·python
于先生吖4 小时前
前后端分离人事招聘项目,校招宣讲预约+社招双向撮合功能架构设计教程
java·开发语言·uni-app
川冰ICE4 小时前
JavaScript进阶④|Symbol与元编程,对象的隐藏身份
开发语言·javascript·ecmascript
码界索隆4 小时前
Python转Java系列:作者有话说
java·开发语言·python
Hiter_John4 小时前
Golang的运算符
开发语言·后端·golang
码界索隆5 小时前
Python转Java系列:前言
java·开发语言·python