[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.mzph.cn/web/73593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++———— Vector

一、vector的介绍及使用 1.1 vector的介绍 1.2 vector 的使用 1.21 vector的定义 演示: 1.22 vector iterator 的使用 1.beginend 主要作用:获取第一个数据位置的迭代器和最后一个数据的下一个位置的迭代器。 演示: 2.rbeginrend 主要…

STL入门

STL入门 作者:blue 时间:2024.3 文章目录 STL入门0.概述1.pair2.set(集合)3.vector4.string字符串类型5.queue,deque,priority_queue6.list的用法 0.概述 本文讨论部分常用的STL的运用 1.pair pair是将2个数据组合成一组数据…

洛谷 P10463 Interval GCD Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​),有 m m m 个操作分两种: add ⁡ ( l , r , k ) \operatorname{add}(l,r,k) add(l,r,k):对每个 i ∈ [ l , r ] i\in[l,r] i∈[l,r] 执行 …

从声源定位(DOA)算法仿真到工程源码实现-第八节

一、概述 本节我们记录在respeaker core v2 开发板上部署一个完整的声源定位(DOA)系统,演示可以看第一节中的视频。整个模块可以分为三部分,第一部分为控制开发板上的LED灯显示,这样可以实时的测试算法的效果;第二部分为从ALSA上取…

在linux部署网站

在Linux部署网站,需要准备一个纯净的系统 一、系统环境准备 1.设置静态IP地址 ‌ 2.关闭默认防火墙 systemctl disable firewalld --now ‌ 3.配置SSH密钥登录 4.yum update -y && reboot # 更新系统内核 5.yum install -y wget curl unzip # 安装…

Java后端API限流秘籍:高并发的防护伞与实战指南

目录导航 📜 🛡️ 为什么需要API限流?🧠 主流限流算法大解析👩‍💻 阿里巴巴的限流实践📏 四大黄金定律🤼 限流策略组合拳🏆 限流场景实战💻 技术实现方案🌟 最佳实践分享📈 结语与展望📚 推荐阅读 1. 🛡️ 为什么需要API限流? 在高并发环境中,未…

OpenGL ES 2.0与OpenGL ES 3.1的区别

如果硬件支持且需要更高质量的图形效果,推荐3.1;如果兼容性和开发简便更重要,且效果需求不高,2.0更合适。不过现代车载系统可能越来越多支持3.x版本,所以可能倾向于使用3.1,但具体情况还需调查目标平台的硬…

k8s存储介绍(五)PV与PVC

在 Kubernetes(k8s)中,持久化存储(Persistent Storage)是一个非常重要的概念,因为 Pod 本身是无状态的,重启后会丢失数据。为了支持有状态应用,Kubernetes 提供了持久化存储的机制&a…

ORA-00600 [2662]

一、数据库启动报ORA-00600[2662] [oraclenode1 ora11g]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.3.0 Production on Thu Dec 22 14:37:00 2011Copyright (c) 1982, 2011, Oracle. All rights reserved.Connected to an idle instance.SQL> startup ORACLE instanc…

WebSocket接入SSL证书

目录 碎碎念解决方法创建 HTTPS WebSocket 服务器创建系统服务启动服务 碎碎念 在访问网站时,使用 HTTPS 非常重要。HTTPS 协议不仅可以确保数据传输的安全性,还可以防止中间人攻击和数据篡改等安全问题。任何没有 SSL 证书的内容都可能会被拒绝访问。因…

c#在work线程中怎样更新UI控件

最近笔者调试修改项目,碰到了c#在work线程中怎样更新UI控件中的场景,简单总结了下,主要有两个方法: 方法1:通过System.Windows.Application.Current.Dispatcher.Invoke来更新UI控件 System.Windows.Application.Curre…

数据结构每日一题day3(顺序表)★★★★★

题目描述:顺序表L的元素递增有序排列,设计一个算法在插入元素x后保持该顺序表仍然递增有序排列,插入成功后返回插入元素所在位置,不成功返回-1 算法思想:在递增有序的顺序表中插入元素 x 并保持有序性,步骤如下: 合法…

MyBatis中mapper.xml 的sql映射规则

一、SQL 映射文件核心元素 MyBatis 映射文件的顶级元素(按定义顺序): cache:命名空间的缓存配置。cache-ref:引用其他命名空间的缓存。resultMap:自定义结果集映射。sql:可重用的 SQL 片段。i…

【计算机网络】计算机网络协议、接口与服务全面解析——结合生活化案例与图文详解

协议、接口与服务 导读一、协议1.1 定义1.2 组成 二、接口三、服务3.1 定义3.2 服务与协议的区别3.3 分类3.3.1 面向连接服务于无连接服务3.3.2 可靠服务和不可靠服务3.3.3 有应答服务和无应答服务 结语 导读 大家好,很高兴又和大家见面啦!!…

Ubuntu服务器中Swapper如何与虚拟内存配合

在Ubuntu服务器中,Swapper和虚拟内存是操作系统中重要的概念,它们共同协作以提高系统的内存管理效率。当物理内存不足时,Swapper会帮助系统将不活跃的数据从内存转移到磁盘上的交换空间(Swap),以释放内存给需要更多资源的进程。下…

SQL Server 中常见的数据类型及其详细解释、内存占用和适用场景

以下是 SQL Server 中常见的数据类型及其详细解释、内存占用和适用场景: 数据类型类别数据类型解释内存占用适用场景整数类型bigint用于存储范围较大的整数,范围是 -2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807)8 字节需要…

vue数字公式篇 Tinymce结合使用(二)

继上一篇的数字公式 , 这次的功能是将公式能插入编辑器以及修改 1、Tinymce 自定义 LateX 按钮,打开公式编辑器窗口 LateX.vue window.tinymce.init({...//基础配置这里我就不写了setup(ed) {//自定义 LateX 按钮ed.ui.registry.addButton(LateX, {text:…

python数据增强和转换

数据增强和转换 固定转换随机转换概率控制的转换 固定转换 边缘补充像素(Pad)尺寸变换(Resize)中心截取(CenterCrop)顶角及中心截取(FiveCrop)尺灰度变换(GrayScale) 概率控制的转换 随机垂直翻转(RandomVerticalFlip)随机应用(RandomApply) # -*- coding: utf-8 -*- fro…

Ubuntu下UEFI安全启动安装Nvdia驱动

简介 众所周知,Ubuntu默认使用Nouveau开源驱动,其性能受限,因此我们需要安装Nvidia专用驱动。 安装专用驱动的一般方法非常简单,只需要sudo ubuntu-drivers devices && sudo ubuntu-drivers autoinstall即可&#xff0c…

05_循环结构三目运算符

目录 一、双重for循环 练习 二、break关键字 三、continue 关键字 练习 四、三元运算 / 三目运算 一、双重for循环 外层循环 循环一次,,,内层循环 循环一圈!!! 循环里嵌套循环: for(var…