彻底搞懂隐式类型转换
《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类构造函数就不能用于隐式地创造对象。
彻底搞懂隐式类型转换相关推荐
- c++隐式类型转换存在的陷阱
Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...
- 没有学不会的C++:用户自定义的隐式类型转换
C++ 中的类型转换包含内建类型的转换和用户自定义类型的转换,而这两者都又可分为隐式转换和显示转换,所以一共有如下四象限表格中的 A.B.C.D 四种情况 隐式转换 显示转换 (casting) 内建 ...
- C语言----表达式求值之隐式类型转换
前言: 表达式求值的顺序一部分是由操作符的优先级和结合性决定. 同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型,称为隐式类型转换,下面给出隐式类型转换的详细讲解,希望对大家有所帮助~ 隐 ...
- c++ 隐式类型转换
隐式类型转换由编译器自动执行,不需程序员介入. 何时发生隐式类型转换 1. 在混合类型的表达式中,操作数会被转换为相同类型 int ival; double dval; ival >= dval ...
- float 与 double、隐式类型转换、switch、重写与重载、Java 与 C++ 的区别、JRE or JDK
1.float 与 double 1.1 字面量属于 double 类型,不能直接将 1.1 直接赋值给 float 变量,因为这是向下转型. // float f = 1.1; Java 不能隐式执 ...
- 数据类型,隐式类型转换
关于数据类型: 1.常量也是有类型的 常量数据大体分两类,一类是带点(实型,浮点型),一类是不带点叫整型. 编译器对带点,通常默认为double,不带点通常编译为int 2.对于数据 .2 ...
- ES5-3 循环、引用值初始、显示及隐式类型转换
1. 循环 for循环的三个参数abc,a只执行一次,c在每次循环后执行 // 打印0-100的质数 1不是质数 var list = [2] for (var i = 3; i <= 100; ...
- 《MySQL tips:隐式类型转换与隐式字符编码转换对查询效率的影响》
维护一个交易系统,交易记录表tradelog包含交易流水号(tradeid).交易员id(operator).交易时间(t_modified)等字段. create table 'tradelog' ...
- int转换为cstring_PostgreSQL 隐式类型转换探秘
个人简介 何小栋, 从事产品研发和架构设计工作,对Oracle.PostgreSQL有深入研究,ITPUB数据库版块资深版主.现就职于广州云图数据技术有限公司,系统架构师,博客:http://blog ...
最新文章
- NIO Socket编程实例
- C++ STL中常见的typename关键字的作用
- Python基础第27天
- bash、dash(/bin/bash和/bin/sh)
- document.getElementsByTagName()方法的返回值
- 固态+机械(uefi类型的bios),用easybcd安装win10+ubuntu16.04双系统
- 年轻人不能“饥渴”太久,否则……
- Mysql(一)——基础知识
- 如何将Excel表批量赋值到ArcGIS属性表
- OpenShift 4 - 用安全上下文(SC)与安全上下文约束(SCC)控制应用对受保护功能的访问
- vue 声明周期函数_vue-router路由守卫-上
- json,pickle,shelve序列化和反序列化
- Asp.net常用的51个代码(非常实用)
- 558. 四叉树交集
- Coinbase、BlockFi相继开启上市准备工作,但SEC准备好了吗?
- 新手搭建一个网站(详细完整版)
- 推荐6款UI设计师必备Sketch插件
- 广东英语高考怎么计算机,2019广东高考英语听说考试大纲出炉!附三大题型得分套路!...
- 强化学习实践三 :编写通用的格子世界环境类
- 华为数通笔记-ISIS基础
热门文章
- Linux之集群部署(超简单!)
- Java + Mysql + JDBC 图书馆 管理系统
- oracle sqlnet配置,sqlnet.ora文件配置详解
- visual studio code教程
- 关于ORA-01034和ORA-27101的一种解决方法
- spring-boot 修改启动图标
- [收藏] 最全服务器基础知识科普
- 【DSP开发】帮您快速入门 TI 的 Codec Engine
- 谈谈在我在外包公司工作的经历
- 计算机专业毕业设计题目大全文库,计算机专业毕业设计论文题目.doc