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

    };

相关推荐
大草原的小灰灰1 小时前
Python面向对象编程
开发语言·python
知识分享小能手1 小时前
C学习教程,从入门到精通,C语言概述 —— 知识点详解(1)
c语言·开发语言·学习
垆边人似月.1 小时前
日志时间窗口内的最大并发请求数(100分 / 滑动窗口 + 排序)
数据结构·c++·算法
Chen_harmony1 小时前
一、C++入门基础
开发语言·c++
学逆向的1 小时前
远程线程注入
开发语言·jvm·网络安全·win32
水饺编程2 小时前
第1章,[Win32 章节]:Windows 的方方面面
c语言·c++·windows·visual studio
阡陌数智2 小时前
RAG 系统的召回退化:向量库、分块、重排全链路问题排查与优化实践
开发语言·人工智能·语言模型·自然语言处理·推荐算法
geovindu2 小时前
rust: Flyweight Pattern
开发语言·后端·设计模式·rust·享元模式·结构型模式
Escalating_xu2 小时前
【C 语言】字符函数和字符串函数:从 ctype 到 strtok、strerror 全面解析
java·c语言·开发语言
悠仁さん3 小时前
【C++】auto
java·前端·c++