条款24:若所有参数皆需类型转换,请为此采用非成员函数

news/2024/12/21 20:24:49/

条款24:若所有参数皆需类型转换,请为此采用非成员函数

设计一个表示有理数的类时,允许从整数隐式转换为有理数是有用的:

class Rational {
public:Rational(int numerator = 0, // 该构造函数没有explicit限制;int denominator = 1); int numerator() const;  int denominator() const;  
//这里尝试将operator *作为Rational的成员函数const Rational operator*(const Rational& rhs) const;
private:int n,d;
};Rational oneEighth(1, 8);
Rational oneHalf(1, 2);
Rational result = oneHalf * oneEighth; 	// 正确
result = result * oneEighth; 			// 正确
result = oneHalf * 2; // result = oneHalf.operator*(2); 正确
//乘法应该是可交换的
result = 2 * oneHalf; // result = 2.operator*(oneHalf); 错误!

编译器还会寻找非成员运算符*(即命名空间或全局作用域中的运算符):

// result = operator*(2, oneHalf);,不存在,错误! 
const Rational operator*(const Rational& lhs, const Rational& rhs) 
{return Rational(lhs.numerator() * rhs.numerator(),lhs.denominator() * rhs.denominator());
}
Rational oneFourth(1, 4);
Rational result;
result = oneFourth * 2; // 正确
result = 2 * oneFourth; // 欧耶,它起作用了!

总结:如果所有参数都需要类型转换(包括一个*this),则该函数必须是一个非成员。


http://www.ppmy.cn/news/1557006.html

相关文章

linux下操作es及kibana的操作记录

背景:工作中后面开始用es和kibana了,为了方便后面的操作,特记录一下,好多命令实在是记不住了,😄 kibana的操作 1.查看所有的索引的命令 GET /_cat/indices2.创建索引的命令 PUT /es_dsj_6c_jky_yunzhe_…

【机器学习】机器学习的基本分类-强化学习-REINFORCE 算法

REINFORCE 算法 REINFORCE 是一种基于策略梯度的强化学习算法,直接通过采样环境中的轨迹来优化策略。它是策略梯度方法的基础实现,具有简单直观的优点。 核心思想 目标函数 最大化策略的期望回报: ​​​​​​​ …

SSL Version 2 and 3 Protocol Detection漏洞修复

使用 IIS Crypto 工具 IIS Crypto 是一个免费工具,使管理员能够在 Windows Server 2008,2012,2016 和 2019 上启用或禁用协议,密码,哈希和密钥交换算法。它还允许您重新排序 IIS 提供的 SSL / TLS 密码套件&#xff0c…

基于GRU门控循环神经网络的多分类预测【MATLAB】

随着深度学习的不断发展,循环神经网络(RNN)在处理时间序列和自然语言处理等领域表现出了强大的能力。然而,传统RNN存在梯度消失和梯度爆炸问题,导致其在长序列任务中的表现受限。为了应对这些问题,门控循环…

【开发】回归 Web 应用的基础

文章目录 回归 Web 应用的基础CSSJavaScriptAjaxjQueryAngularJSReactVue.js其他框架打包工具渐进增强过犹不及回归本源回归 Web 应用的基础 最初,只有 HTML。第一个正式的 HTML 规范专注于语义标记,其中仅包含少量样式标签和属性。HTML 文档的渲染完全由浏览器决定。 这个…

<javascript><css><nodejs>使用express构建一个本地服务器,使用http获取服务器图片和视频,网页端grid布局显示

前言 本文是一个前端示例,是基于nodejs使用express构建一个简单的服务器,并扫描本地资源文件夹,获取视频和图片,网页端通过http来向服务器请求,并将返回的资源在网页端程序,布局为grid。 环境配置 系统&am…

跨越平台界限:探索Native AOT的交叉编译技术

在当今多元化的技术生态中,软件开发者们经常面临一个挑战:如何使应用程序能够在不同的操作系统和硬件平台上无缝运行。传统的解决方案通常依赖于解释型语言或虚拟机技术,但这些方法在某些高性能要求或资源受限的场景中可能并不理想。Native A…

python读excel数据

python读取excel时默认第一行是标题,因此推荐采用matlab先加全零行再读数 示例: 首先用matlab生成excel文件,记为data_mat.xlsx clc clear close all dataones(5,5); xlswrite(data_mat.xlsx,data)再用matlab加零行 clc clear close all %%…