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

    };

相关推荐
weixin_440784111 天前
【HandlerThread实现原理】
android·java·开发语言
天空'之城1 天前
C 语言工业级通用组件手写 24:互补滤波
c语言·开发语言·互补滤波·嵌入式算法·工业级组件
XR1234567881 天前
工厂车间无线网络方案对比:AGV漫游哪家强?
开发语言·php
傻啦嘿哟1 天前
某短视频平台视频爬虫实战:抓取推荐流视频信息,绕过反爬的3种技巧
开发语言·爬虫·python
現実君1 天前
【硬件进阶】AD22上位替换JLEDA教程
开发语言·php
mubei-1231 天前
SpringDAO的用法
java·开发语言·数据库
2601_956121971 天前
二分算法(知识点+题目)
c++·算法
格林威1 天前
多相机微秒级对齐:硬件触发 vs PTP(IEEE 1588)方案实战对比
开发语言·人工智能·数码相机·机器学习·计算机视觉·视觉检测·机器视觉
初级代码游戏1 天前
iOS开发 Swift 速记2:三种集合类型 Array Set Dictionary
开发语言·ios·swift
蒙奇·D·路飞-1 天前
OpenClaw:开源的《合金弹头》精神续作与终极本地部署指南
c++·开源·mfc