explicit(显式的):作用是"禁止单参数构造函数"被用于自动类型转换

non-explicit:

class Fraction
{public:Fraction(int num,int den=1):m_numerator(num),m_denominator(den){}Fraction operator +(const Fraction& f){return Fraction(......);}
private:int m_numerator; //分子int m_denominator;//分母
}
//调用
Fraction f(3,5);
Fraction d2=f+4;
//在调用的时候,因为有函数Fraction operator +(const Fraction& f),因此编译器会判断4是否能转换成Fraction,
//如果能的话则可以调用函数Fraction operator +(const Fraction& f),此函数即为Fraction operator +(this,const Fraction& f)
//由于有构造函数Fraction(int num,int den=1),因此4可转换为Fraction(4,1)

并存报错的形式:

class Fraction
{public:Fraction(int num,int den=1):m_numerator(num),m_denominator(den){}operator double()const{return (double)(m_numerator/m_denominator);}Fraction operator +(const Fraction& f){return Fraction(......);}
private:int m_numerator; //分子int m_denominator;//分母
}
//调用
Fraction f(3,5);
Fraction d2=f+4;
//编译器不知道是应该把4转换为Fraction还是应该用转换函数将f转换成double,所以会报错

构造函数加explicit:

class Fraction
{public:explicit Fraction(int num,int den=1):m_numerator(num),m_denominator(den){}operator double()const{return (double)(m_numerator/m_denominator);}Fraction operator +(const Fraction& f){return Fraction(......);}
private:int m_numerator; //分子int m_denominator;//分母
}
//调用
Fraction f(3,5);
Fraction d2=f+4;
//此处在进行f+4的时候,由于构造函数加了explicit,4就不会再变成1/4的Fraction形式了,此时编译器就不会进行Fraction operator +(const Fraction& f)的函数了,因为4不能转成Fraction的形式,因此只能调用operator double()const函数,将f转换成double的形式
//此时得到的d2是double值,不能转换成Fraction的形式,故报错

c++面向对象高级编程 学习八 non-explicit-one-argement-ctor相关推荐

  1. c++面向对象高级编程 学习十七 const, new, delete

    文章目录 常量成员函数 new和delete 常量成员函数 常量成员函数是不改变成员数据. 当成员函数的const和non-const版本同时存在时,const object只能调用const版本,n ...

  2. c++面向对象高级编程 学习十六 vptr和vtbl

    当一个类中有一个或多个虚函数时,内存中会多一个虚指针(vptr,virtual pointer),指向一个虚表(vtbl,virtual table) 父类有虚函数,则子类一定有虚函数 在下图示意图中 ...

  3. c++面向对象高级编程 学习十五 组合继承关系下的构造和析构

    文章目录 继承关系 组合关系 继承和组合 继承关系 构造由内而外,析构由外而内,内即是父类 组合关系 A拥有B, 构造由内而外,析构由外而内,内即是B 继承和组合 构造和析构顺序如图:

  4. c++面向对象高级编程 学习十四 引用

    文章目录 reference reference的常见用途 reference 变量有三种形式:值,指针,引用 int x=0; //值 int* p=&x;//指向整型的指针,地址,指针在之 ...

  5. c++面向对象高级编程 学习十三 数量不定的模板参数,auto,for

    文章目录 数量不定的模板参数 auto ranged-base for 数量不定的模板参数 void print() {} //... 表示参数的数量不定 template<typename T ...

  6. c++面向对象高级编程 学习十二 模板

    模板特化: 模板是一种泛化的形式,特化是将参数类型进行指定,写出特化的版本,当在调用下图cout<<hash()(1000);的时候,由于特化中有struct hash{ }的版本,因此会 ...

  7. c++面向对象高级编程 学习十一 类模板、函数模板、成员模板

    namespace经验谈: 团队中函数或类的名字可能会冲突,因此使用namespace进行区分. 类模板: template<typename T> 函数模板: template<c ...

  8. c++面向对象高级编程 学习十 function-like classes

    本节是设计一个class,使它的行为像一个函数. 如果一个东西能接受小括号()操作符,那么这个东西就称之为函数,或像函数的东西. 下图为三个函数对()的重载,这三个类均为像函数的类,它们可接受()操作 ...

  9. c++面向对象高级编程 学习九 pointer-like classes

    c++的class设计出来有两种形式,一种像指针,一种像函数 智能指针里包含普通指针,要写 * 和 -> 的函数 sp->method(); //sp-> 经 T* operator ...

最新文章

  1. android base64编码
  2. MATLAB中代码优化的两种方法
  3. rman-incarnation
  4. npm安装serve实现静态资源的访问
  5. 【原创】MapReduce编程系列之表连接
  6. php having,having方法
  7. 由遍历集合所联想到的一些问题
  8. 最近ubuntu+gpu装机记录
  9. HTML常用的标签总结
  10. v22.03 鸿蒙内核源码分析(汇编基础) | CPU上班也要打卡 | 百篇博客分析HarmonyOS源码
  11. 安卓比较好的数独软件_有没有比较好的数独游戏APP?
  12. USB-PD 协议解析 - 简单易懂协议详解
  13. 全球最大湾区|微信大数据:《粤港澳大湾区智慧生活圈报告》
  14. Bash shell学习笔记(五)
  15. upc组队训练第十九场
  16. c++逆天改命进阶--多态
  17. Hexo个人博客绑定域名
  18. vm虚拟服务器添加网卡,win7系统下vmware虚拟机添加加载无线网卡的方法
  19. 盖亚假说:地球是一个生命体吗?
  20. bzoj3159 决战 LCT

热门文章

  1. 单选按钮_PerlTk教程之按钮Button、复选按钮Checkbutton、单选按钮Radiobutton(附完整代码)...
  2. 【转】ABP源码分析二十八:ABP.MemoryDB
  3. 【转】如何用好SVN的Branch
  4. 【转】微服务架构下分布式事务方案
  5. python程序框架的描述_简单介绍Python下自己编写web框架的一些要点
  6. 用sqoop把hdfs数据存储到mysql报错,Job job_1566707990804_0002 failed with state FAILED due to: Tas k failed
  7. MD5加密方式-工具类
  8. 【牛客 - 330G】Applese 的毒气炸弹(最小生成树,构造,判连通图)
  9. app android de,Android Deobfuscation
  10. php$this-conn可以不先定义吗,CodeIgniter 是不是支持PDO 查询?还是本来就不支持