文章目录

  • 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相关推荐

  1. 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 ...

  2. postgresql中sql查询语句报错处理——ERROR: failed to find conversion function from unknown to text

    执行复杂查询遇到ERROR: failed to find conversion function from unknown to text . 后来通过查资料,原来我里面用到别名了,别名直接用的话会 ...

  3. C++转换函数 (conversion function)

    本文将介绍C++中的转换函数(conversion function). 1.代码 设计一个类Fraction表示分数,包含分子和分母.我们希望它能自动转换为double类型,并参与运算. Fract ...

  4. no suitable conversion function from “std::reverse_iterator<double *>“ to “double *“ exists

    C++ STL迭代器类型错误,比如迭代器类型应该为reverse_iterator但是你定义的时iterator

  5. C++学习笔记 转换函数(conversion function)

    #include <iostream> using namespace std;class Fraction // 分数 { public:explicit Fraction(int nu ...

  6. C++__conversion function,Non-explicit one argument constructor

    C++__conversion function,Non-explicit one argument constructor 1.conversion function 2.Non-explicit ...

  7. CMake结合PCL库学习(1)

    经常会有有人问到CMake的学习的问题,而且网上也有很多博客是介绍学习CMake 的用法,但是我觉的学习不用这样死板,用到了就顺便学习一下,也就是边做边学,由浅入深,慢慢的就会熟悉了,这个学习的过程中 ...

  8. C++中类型转换函数:将当前类的类型转换为其它类型

    1.C++中类型转换函数:将当前类的类型转换为其它类型 转换构造函数能够将其它类型转换为当前类类型(例如将double类型转换为complex类型),但是不能反过来将当前类类型转换为其它类型(例如将c ...

  9. Effective C++ 学习笔记

    基于此文档 http://wenku.baidu.com/view/ef989106e87101f69e3195db.html 条款13:以对象管理资源 目标:为确保资源被释放 1.获得资源后立即放进 ...

最新文章

  1. 训练神经网络最应该注意什么才能让显卡最大限度的发挥性能
  2. Linux系统资源限制
  3. mysql安装主从配置_MySQL安装与主从配置
  4. java中的%nf_java中DecimalFormat四舍五入用法详解
  5. 计算机与体育教育的关系,体育教学论文:健康教育与体育教育存在的问题研究...
  6. Windowstelnet服务怎么开启 Win11telnet服务怎么开启详细介绍
  7. css引用与html语义化
  8. [小北De编程手记] : Lesson 01 玩转 xUnit.Net 之 概述
  9. arcgis水文分析_值得收藏!用DEM做水文分析前,你还需要储备的知识
  10. 什么是网络基础设施?
  11. 微软鼠标测试软件,微软IO1.1鼠标使用测试_微软 IO1.1红光鲨鼠标(战队包黑色版)_键鼠评测-中关村在线...
  12. 为基因序列片段在NCBI的GenBank数据库申请登录号
  13. 人工智能技术的原理是什么,人工智能技术在实际应用中具有哪些优势?
  14. 三國演義與三國志兩部文本的導讀概要2019年5月11日
  15. 网页提示504 gateway time-out是什么意思?如何解决?
  16. php怎么判断qq内置浏览器,PHP判断是否是微信打开,浏览器打开的方法
  17. 2020-02-08
  18. js vue+elementui 全屏跟退出全屏功能搬砖
  19. [从头读历史] 第280节 诗经目录以及十五国风的地域分布
  20. 周末作业-循环练习题(2)

热门文章

  1. 如何在阿里云服务器上搭建mysql服务(最新版)
  2. 小说作者推荐: 闹月合集
  3. 如何去处右下角任务栏闪动邮件图标小广告?WPS干的好事!
  4. 【MySQL 8.0 OCP 1Z0-908认证考试】题库精讲--第四讲mysql8.0权限安全审计(上)
  5. TFTLCD之FSMC详解
  6. 2019奥林匹克计算机竞赛试题,2019-2020年小学数学奥林匹克竞赛试题及答案三年级...
  7. 星号构成的倒立直角三角形图案
  8. android运行模拟器时出现Unfortunately xxx has stopped的解决办法(实用)
  9. matlab如何创建table,创建和使用表 - MATLAB Simulink - MathWorks 中国
  10. android申请悬浮窗代码,三行代码实现Android应用内悬浮窗,无需一切权限,适配所有ROM和厂商...