当前位置: 首页 > article >正文

[Effective C++]条款24:若所有参数皆需类型转换,请为此采用non-menber函数

.
1、操作符重载&隐式类型转换

  • C++中,操作符重载可以通过成员函数或非成员函数来实现。当操作符重载是成员函数时,左操作数必须是该类的对象。如果左操作数不是该类的对象,而是需要进行隐式转换的类型,编译器将无法找到匹配的成员函数,从而导致编译错误。
  • 为了避免这个问题,可以将操作符重载定义为非成员函数。非成员函数允许左操作数和右操作数都进行隐式类型转换,从而解决编译错误的问题。

2、代码示例

  • 创建一个Rational类,希望支持Rational对象与整数之间的加法操作。如果将加法操作符重载成成员函数,那么当整数作为左操作数时,编译器无法找到匹配的成员函数,导致编译失败
  • 下面代码中2不是Rational对象,无法调用Rational的成员函数operator+,因为编译器不会对左操作数进行隐式类型转换,成员函数的调用依赖于类的实例。
class Rational {
public:
    Rational(int numerator = 0, int denominator = 1) 
        : numerator_(numerator), denominator_(denominator) {}

    // 成员函数重载加法操作符
    Rational operator+(const Rational& other) const {
        return Rational(numerator_ * other.denominator_ + other.numerator_ * denominator_,
                        denominator_ * other.denominator_);
    }

private:
    int numerator_;
    int denominator_;
};

int main() {
    Rational r1(1, 2);
    Rational r2 = r1 + 2; // 正确:2 可以隐式转换为 Rational 对象
    Rational r3 = 2 + r1; // 错误:2 不能作为左操作数调用成员函数 operator+
}

3、非成员函数重载

  • 非成员函数,允许左操作数和右操作数都进行隐式类型转换
class Rational {
public:
    Rational(int numerator = 0, int denominator = 1) 
        : numerator_(numerator), denominator_(denominator) {}

    int numerator() const { return numerator_; }
    int denominator() const { return denominator_; }

private:
    int numerator_;
    int denominator_;
};

// 非成员函数重载加法操作符
Rational operator+(const Rational& lhs, const Rational& rhs) {
    return Rational(lhs.numerator() * rhs.denominator() + rhs.numerator() * lhs.denominator(),
                    lhs.denominator() * rhs.denominator());
}

int main() {
    Rational r1(1, 2);
    Rational r2 = r1 + 2; // 正确:2 可以隐式转换为 Rational 对象
    Rational r3 = 2 + r1; // 正确:2 可以隐式转换为 Rational 对象
}

思维导图笔记:

请添加图片描述


http://www.kler.cn/a/611748.html

相关文章:

  • 【go微服务】跨语言RPC接口工具--protobuf语法与原理解读以及应用实战
  • [MRCTF2020]套娃
  • 实战 | 基于 SpringBoot + UniApp 打造国际版打车系统:架构设计与性能优化全解析
  • SQL优化 | OceanBase是否遵循最左匹配原则?(三)
  • MDC的原理是什么?
  • 计算机二级(C语言)考试高频考点总汇(二)—— 控制流、函数、数组和指针
  • 向量数据库的适用场景与局限性分析
  • Java爬虫如何解析返回的JSON数据?
  • Dynamic Soft Contrastive Learning for Time Series Anomaly Detection 解读
  • 【2025】基于springboot+uniapp的企业培训打卡小程序设计与实现(源码、万字文档、图文修改、调试答疑)
  • 套接字Socket
  • 算法-深度优先搜索
  • ubuntu单机部署redis集群
  • HarmonyOS NEXT 鸿蒙中关系型数据库@ohos.data.relationalStore API 9+
  • IP 分片重组与 TCP 会话重组
  • 二分查找模板--从题目中讲解三大二分模板
  • [vue]计算属性
  • WPF ContentPresenter详解2
  • 网损仪详解
  • 比R版本快几十倍| Pyscenic单细胞转录因子预测