conversion function
文章目录
- conversion function (自定义类型转换为其余类型)
- non-explicit-one-argument constructor (基本类型转换为自定义类型)
- conversion function v.s. non-explicit-one-argument constructor
- explicit-one-argument constructor
conversion function (自定义类型转换为其余类型)
- 比如自定义了一个Fraction分数类, 它应该可以被转换为double
operator type() const {…};
- 返回值类型默认和type相同
- 函数名operator type()
- 因为function body中不修改数据成员, 因此设置为const.
- 执行
2+f
时, 首先会检查有没有operator+对应的重载- 如果没有, 再看能不能把f转换成数字类型
class Fraction{public:Fraction(int num, int den = 1) : m_numerator(num), m_denominator(den) {}operator double() const {return double(m_numerator) / double(m_denominator);}
private:int m_numerator;int m_denominator;
};void test() {Fraction f(3,5);cout<<2+f<<endl;
}
non-explicit-one-argument constructor (基本类型转换为自定义类型)
- 执行
f + 1
时, 编译器首先去查看Fraction有没有重载+运算符- 发现重载了, 但是接收的参数类型是Fraction, 然后再看能不能把1转换成Fraction
- 发现了non-explicit-one-argument constructor, 调用这个构造函数创建了一个Fraction对象
- 然后调用了operator+函数
- two parameter 两个形参, one argument 一个实参
class Fraction{public:Fraction(int num, int den = 1) : m_numerator(num), m_denominator(den) {}Fraction operator+ (const Fraction& f) {return Fraction(this->m_numerator + f.m_numerator, this->m_denominator + f.m_denominator);}
private:int m_numerator;int m_denominator;
};void test() {Fraction f(3,5);Fraction d2 = f + 1;
}
conversion function v.s. non-explicit-one-argument constructor
- Use of overloaded operator ‘+’ is ambiguous
- 第一种情况 : f使用conversion function可以转换为double类型, 和1相加后, 成为一个数字类型, 可以调用non-explicit-one-argument隐式转换为Fraction对象
- 第二种情况 : 1先调用non-explicit-one-argument隐式转换为Fraction对象, 然后调用operator+ 两个Fraction对象相加
class Fraction{public:Fraction(int num, int den = 1) : m_numerator(num), m_denominator(den) {cout<<"ctor"<<endl;}operator double() const {return double(m_numerator) / double(m_denominator);}Fraction operator+ (const Fraction& f) {return Fraction(this->m_numerator + f.m_numerator, this->m_denominator + f.m_denominator);}
private:int m_numerator;int m_denominator;
};void test() {Fraction f(3,5);Fraction d2 = f + 1;
}
explicit-one-argument constructor
- 将构造函数声明为explicit, 使得无法进行隐式转换. 因此1无法转换为Fraction
class Fraction{public:explicit Fraction(int num, int den = 1) : m_numerator(num), m_denominator(den) {cout<<"ctor"<<endl;}operator double() const {return double(m_numerator) / double(m_denominator);}Fraction operator+ (const Fraction& f) {return Fraction(this->m_numerator + f.m_numerator, this->m_denominator + f.m_denominator);}
private:int m_numerator;int m_denominator;
};void test() {Fraction f(3,5);cout<<f + 1<<endl; //1.6
}
conversion function相关推荐
- 2022-2-13 转换函数(conversion function) non-explicit-one argument ctor explicit-one argument ctor
学习时间及标题: 2022-2-13 转换函数(conversion function) non-explicit-one argument ctor explicit-one argument ct ...
- postgresql中sql查询语句报错处理——ERROR: failed to find conversion function from unknown to text
执行复杂查询遇到ERROR: failed to find conversion function from unknown to text . 后来通过查资料,原来我里面用到别名了,别名直接用的话会 ...
- C++转换函数 (conversion function)
本文将介绍C++中的转换函数(conversion function). 1.代码 设计一个类Fraction表示分数,包含分子和分母.我们希望它能自动转换为double类型,并参与运算. Fract ...
- no suitable conversion function from “std::reverse_iterator<double *>“ to “double *“ exists
C++ STL迭代器类型错误,比如迭代器类型应该为reverse_iterator但是你定义的时iterator
- C++学习笔记 转换函数(conversion function)
#include <iostream> using namespace std;class Fraction // 分数 { public:explicit Fraction(int nu ...
- C++__conversion function,Non-explicit one argument constructor
C++__conversion function,Non-explicit one argument constructor 1.conversion function 2.Non-explicit ...
- CMake结合PCL库学习(1)
经常会有有人问到CMake的学习的问题,而且网上也有很多博客是介绍学习CMake 的用法,但是我觉的学习不用这样死板,用到了就顺便学习一下,也就是边做边学,由浅入深,慢慢的就会熟悉了,这个学习的过程中 ...
- C++中类型转换函数:将当前类的类型转换为其它类型
1.C++中类型转换函数:将当前类的类型转换为其它类型 转换构造函数能够将其它类型转换为当前类类型(例如将double类型转换为complex类型),但是不能反过来将当前类类型转换为其它类型(例如将c ...
- Effective C++ 学习笔记
基于此文档 http://wenku.baidu.com/view/ef989106e87101f69e3195db.html 条款13:以对象管理资源 目标:为确保资源被释放 1.获得资源后立即放进 ...
最新文章
- 训练神经网络最应该注意什么才能让显卡最大限度的发挥性能
- Linux系统资源限制
- mysql安装主从配置_MySQL安装与主从配置
- java中的%nf_java中DecimalFormat四舍五入用法详解
- 计算机与体育教育的关系,体育教学论文:健康教育与体育教育存在的问题研究...
- Windowstelnet服务怎么开启 Win11telnet服务怎么开启详细介绍
- css引用与html语义化
- [小北De编程手记] : Lesson 01 玩转 xUnit.Net 之 概述
- arcgis水文分析_值得收藏!用DEM做水文分析前,你还需要储备的知识
- 什么是网络基础设施?
- 微软鼠标测试软件,微软IO1.1鼠标使用测试_微软 IO1.1红光鲨鼠标(战队包黑色版)_键鼠评测-中关村在线...
- 为基因序列片段在NCBI的GenBank数据库申请登录号
- 人工智能技术的原理是什么,人工智能技术在实际应用中具有哪些优势?
- 三國演義與三國志兩部文本的導讀概要2019年5月11日
- 网页提示504 gateway time-out是什么意思?如何解决?
- php怎么判断qq内置浏览器,PHP判断是否是微信打开,浏览器打开的方法
- 2020-02-08
- js vue+elementui 全屏跟退出全屏功能搬砖
- [从头读历史] 第280节 诗经目录以及十五国风的地域分布
- 周末作业-循环练习题(2)
热门文章
- 如何在阿里云服务器上搭建mysql服务(最新版)
- 小说作者推荐: 闹月合集
- 如何去处右下角任务栏闪动邮件图标小广告?WPS干的好事!
- 【MySQL 8.0 OCP 1Z0-908认证考试】题库精讲--第四讲mysql8.0权限安全审计(上)
- TFTLCD之FSMC详解
- 2019奥林匹克计算机竞赛试题,2019-2020年小学数学奥林匹克竞赛试题及答案三年级...
- 星号构成的倒立直角三角形图案
- android运行模拟器时出现Unfortunately xxx has stopped的解决办法(实用)
- matlab如何创建table,创建和使用表
- MATLAB Simulink
- MathWorks 中国
- android申请悬浮窗代码,三行代码实现Android应用内悬浮窗,无需一切权限,适配所有ROM和厂商...