《C++ Primer》中提到:

“可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换。”

注意, “可以用单个形参进行调用” 并不是指构造函数只能有一个形参,而是它可以有多个形参,但那些形参都是有默认实参的。

那么,什么是“隐式转换”呢? 从 构造函数形参类型 到 该类类型 的一个编译器的自动转换。

通过下面代码来看一看:

#include <string>
#include <iostream>
using namespace std;
class BOOK  //定义了一个书类
{private:string _bookISBN;  //书的ISBN号float _price;      //书的价格public://定义了一个成员函数,这个函数是“实参为类类型的函数”//这个函数用于比较两本书的ISBN号是否相同bool isSameISBN(const BOOK & other) {return other._bookISBN == _bookISBN;}//类的构造函数  “传一个参数就可以进行调用的构造函数”(虽然它有两个形参,但其中一个有默认实参,只用一个参数也能进行调用)BOOK(string ISBN, float price = 0.0f) :_bookISBN(ISBN), _price(price) {}
};int main()
{BOOK A("A-A-A");   //生命周期是整个main函数BOOK B("B-B-B");BOOK("C-C-C");    //匿名对象,生命周期在这一行cout << A.isSameISBN(B) << endl;               //正常调用函数,无需发生转换cout << A.isSameISBN(string("A-A-A")) << endl; //此处即发生一个隐式转换:string类型-->BOOK类型,借助BOOK的构造函数进行转换,以满足isSameISBN函数的传参要求。cout << A.isSameISBN(BOOK("A-A-A")) << endl;   //显式创建匿名临时对象,也即是编译器干的事情。system("pause");
}

通过代码可以看到,isSameISBN函数需要BOOK类类型的形参,但传递的参数是string类型。但是,BOOK类中有个构造函数,它使用一个string类型实参进行调用,编译器调用了这个构造函数,隐式地将stirng类型转换为BOOK类型(构造了一个BOOK临时对象),再传递给isSameISBN函数。

隐式类类型转换还是会带来风险的,隐式转换得到类的临时变量,完成操作后就消失了,我们构造了一个完成测试后被丢弃的对象。

我们可以通过explicit声明来抑制这种转换:

explicit BOOK(string ISBN,float price=0.0f):_bookISBN(ISBN),_price(price){}

explicit关键字修饰构造函数。会禁止单参构造函数的隐式类型转换。
BOOK类构造函数就不能用于隐式地创造对象。

彻底搞懂隐式类型转换相关推荐

  1. c++隐式类型转换存在的陷阱

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  2. 没有学不会的C++:用户自定义的隐式类型转换

    C++ 中的类型转换包含内建类型的转换和用户自定义类型的转换,而这两者都又可分为隐式转换和显示转换,所以一共有如下四象限表格中的 A.B.C.D 四种情况 隐式转换 显示转换 (casting) 内建 ...

  3. C语言----表达式求值之隐式类型转换

    前言: 表达式求值的顺序一部分是由操作符的优先级和结合性决定. 同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型,称为隐式类型转换,下面给出隐式类型转换的详细讲解,希望对大家有所帮助~ 隐 ...

  4. c++ 隐式类型转换

    隐式类型转换由编译器自动执行,不需程序员介入. 何时发生隐式类型转换 1. 在混合类型的表达式中,操作数会被转换为相同类型 int ival; double dval; ival >= dval ...

  5. float 与 double、隐式类型转换、switch、重写与重载、Java 与 C++ 的区别、JRE or JDK

    1.float 与 double 1.1 字面量属于 double 类型,不能直接将 1.1 直接赋值给 float 变量,因为这是向下转型. // float f = 1.1; Java 不能隐式执 ...

  6. 数据类型,隐式类型转换

     关于数据类型: 1.常量也是有类型的 常量数据大体分两类,一类是带点(实型,浮点型),一类是不带点叫整型. 编译器对带点,通常默认为double,不带点通常编译为int 2.对于数据   .2  ...

  7. ES5-3 循环、引用值初始、显示及隐式类型转换

    1. 循环 for循环的三个参数abc,a只执行一次,c在每次循环后执行 // 打印0-100的质数 1不是质数 var list = [2] for (var i = 3; i <= 100; ...

  8. 《MySQL tips:隐式类型转换与隐式字符编码转换对查询效率的影响》

    维护一个交易系统,交易记录表tradelog包含交易流水号(tradeid).交易员id(operator).交易时间(t_modified)等字段. create table 'tradelog' ...

  9. int转换为cstring_PostgreSQL 隐式类型转换探秘

    个人简介 何小栋, 从事产品研发和架构设计工作,对Oracle.PostgreSQL有深入研究,ITPUB数据库版块资深版主.现就职于广州云图数据技术有限公司,系统架构师,博客:http://blog ...

最新文章

  1. NIO Socket编程实例
  2. C++ STL中常见的typename关键字的作用
  3. Python基础第27天
  4. bash、dash(/bin/bash和/bin/sh)
  5. document.getElementsByTagName()方法的返回值
  6. 固态+机械(uefi类型的bios),用easybcd安装win10+ubuntu16.04双系统
  7. 年轻人不能“饥渴”太久,否则……
  8. Mysql(一)——基础知识
  9. 如何将Excel表批量赋值到ArcGIS属性表
  10. OpenShift 4 - 用安全上下文(SC)与安全上下文约束(SCC)控制应用对受保护功能的访问
  11. vue 声明周期函数_vue-router路由守卫-上
  12. json,pickle,shelve序列化和反序列化
  13. Asp.net常用的51个代码(非常实用)
  14. 558. 四叉树交集
  15. Coinbase、BlockFi相继开启上市准备工作,但SEC准备好了吗?
  16. 新手搭建一个网站(详细完整版)
  17. 推荐6款UI设计师必备Sketch插件
  18. 广东英语高考怎么计算机,2019广东高考英语听说考试大纲出炉!附三大题型得分套路!...
  19. 强化学习实践三 :编写通用的格子世界环境类
  20. 华为数通笔记-ISIS基础

热门文章

  1. Linux之集群部署(超简单!)
  2. Java + Mysql + JDBC 图书馆 管理系统
  3. oracle sqlnet配置,sqlnet.ora文件配置详解
  4. visual studio code教程
  5. 关于ORA-01034和ORA-27101的一种解决方法
  6. spring-boot 修改启动图标
  7. [收藏] 最全服务器基础知识科普
  8. 【DSP开发】帮您快速入门 TI 的 Codec Engine
  9. 谈谈在我在外包公司工作的经历
  10. 计算机专业毕业设计题目大全文库,计算机专业毕业设计论文题目.doc