Effective C++:规定24:如果所有的单位都需要的参数类型转换,使用请做到这一点non-member功能
2024-08-30 09:40:33
(一个)
如果一个class。同意整数“隐式转换为”有理数似乎非常合理。
class Rational{
public:
Rational(int numerator = 0, int denominator = 1); //刻意不为explicit;同意int-to-Rational隐式转换
int numerator()const;
int denominator()const;
};
在支持算术运算符时考虑该由member函数、还是non-member函数来实现:
(1)成员函数的写法:
class Rational{
public:
const Rational operator*(const Rational& rhs) const;
}; Rational oneEight(1,8);
Rational onehalf(1,2);
Rational result = oneHalf * oneEight; //nice
result = result * oneEight; //ok
可是你希望支持混合运算:
result = oneHalf * 2; //ok 2发生了隐式类型转换。 result = 2 * oneHalf; //wrong !!!
编译器将上述语句转换为下面语句:
result = oneHalf.operator*(2); //ok
result = 2.operator*(oneHalf); //wrong!
oneHalf是一个含operator*函数的class的一个对象。可是2却没有对应的class,编译器会尝试寻找可被下面这般调用的non-member operator*(也就是在命名空间内 或 global作用域内):
result = operator*(2, oneHalf);//wrong!
本例不存在这样一个接受int和Rational作为參数的non-member operator* 因此查找失败。
仅仅有当參数被列于參数列(parameter
list)内,这个參数才是隐式类型转换的合格參与者。
地位相当于“被调用之成员函数所隶属的那个对象”——即this对象的那个隐喻參数,绝不是隐式转换的合格參与者。
(二)解决这样的问题的方法:
为了支持混合运算。让operator* 成为一个non-member函数。便同意编译器在每个实參身上运行隐式类型转换:
const Rational operator*(const Rational& lhs, const Rational& rhs)
{
return Rational(lhs.numerator() * rhs.numerator(), lhs.denominator() * rhs.denominator());
} result = 2 * oneHalf;//ok。最终编译通过了!
operator*是否要成为Rational的friend函数呢?答案是否定的。由于operator*全然籍由Rational的public接口完毕任务;
不管何时假设你能够避免friend函数就该避免。
请记住:
假设你须要为某个函数的全部參数(包含被this指针所指的那个隐喻參数)进行类型转换,那么这个函数必须是个non-member。
版权声明:本文博客原创文章。博客,未经同意,不得转载。
最新文章
- linux下cmake编译安装、配置和卸载mysql
- python学习应用笔记(一)
- VIM 技巧 (一)全文统一添加
- HTML之正则表达式
- UVA 558 Wormholes
- 《paste命令》-linux命令五分钟系列之二十
- Oracle EBS-SQL (SYS-2): sys_在线用户查询.sql
- Restify —— 在Node.js中构建正确的REST Web服务
- 游戏UI框架设计(7): 资源国际化技术
- [翻译] 对正在使用EF6x开发人员的一些话
- 简单实现 C# 与 Javascript的兼容
- Jenkins+Ansible+Gitlab自动化部署三剑客-gitlab本地搭建
- c#大文件的拷贝
- [译]MediatR, FluentValidation, and Ninject using Decorators
- Linux命令第一篇
- CoAP 协议解析说明(转)
- ubuntu-docker入门到放弃(七)Dockerfile简介
- SSH登录启用Google二次身份验证
- 《数据库系统概念》10-ER模型
- WPF 矩形框8个控制点伸缩及拖拽
热门文章
- centos7 安装php环境和安装swoole
- java异常——捕获异常+再次抛出异常与异常链
- ios开发多线程四:NSOperation多图下载综合案例
- Tomcat生产中优化JVM的配置实例
- Java多线程系列-线程创建
- [React Native] Animate Styles of a React Native View with Animated.timing
- source insight 添加自定义macro
- 【Windows Defender Antivirus Service 永久禁用 】
- HDoj-1874-畅通project续-Dijkstra算法
- 【25.47%】【codeforces 733D】Kostya the Sculptor