C++ 类的隐式转换
所谓类的隐式转换,就是将实参类型转成形参类型--如果不一致的话。
这个转换与基本类型转换不太一样,具体则是在形参类型的构造函数中使用实参类型的数据,从而构造出一个临时对象。
下面的代码,类Person 的成员函数 isSamePerson(const Person &person) const ,理论上需要一个 Person 引用,但实际上被传递了一个 string对象!
编译器会自动调用 Person tmp(str)构造函数 来构造一个临时对象,而不是真的将 string类型 转成 Person 类型!
代码:
#include <iostream> #include <string>using namespace std;class Person{private:string name;int id;public:Person(const string &nm=string("xxx")):name(nm),id(0){} //就不用默认无参构造了 ;隐式转换public:bool isSamePerson (const Person &person) const{ //const成员函数 ,只能调用const成员(变量、函数)!cout<<"比较对象:"<<person.getId()<<"--"<<person.getName()<<endl;//return id == person.getId(); //}const int &getId() const{ //任意一个const去掉后,都会导致问题。。。 return id;}const string &getName() const{ //因为const修饰的是this指向的对象,所以也必须返回const引用return name;} };int main(){string a="aaa";Person p1(a);cout<<p1.getId()<<"--"<<p1.getName()<<endl;string b="bbb";cout<<p1.isSamePerson(b)<<endl; //隐式转换!!! return 0; }
尽管有时候这样的转换是我们需要的,但也有不需要的时候,这个时候,给类中的构造函数声明加上explicit,则会防止在需要隐式转换的上下文中使用该构造函数。
#include <iostream> #include <string>using namespace std;class Person{private:string name;int id;public:explicit Person(const string &nm=string("xxx")):name(nm),id(0){} //就不用默认无参构造了 ;显式 explicitpublic:bool isSamePerson (const Person &person) const{ //const成员函数 cout<<"比较对象:"<<person.getId()<<"--"<<person.getName()<<endl;//return id == person.getId(); //}const int &getId() const{ //任意一个const去掉后,都会导致问题。。。 return id;}const string &getName() const{ //因为const修饰的是this指向的对象,所以也必须返回const引用 return name;} };int main(){string a="aaa";Person p1(a);cout<<p1.getId()<<"--"<<p1.getName()<<endl;string b="bbb";cout<<p1.isSamePerson(Person(b))<<endl;//显式转换!!! return 0; }
结论:除非有明显的理由想要使用隐式转换,否则,单形参的构造函数应该设置为explicit 。
其他:前向声明只能用于使用指针或引用的情况。
C++ 类的隐式转换相关推荐
- C语言隐式/显式类型转换 | C++四种强制类型转换、类的隐式转换、explicit
文章目录 C语言类型转换 隐式类型转换 显式类型转换 C++ 强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast 类的隐式类型转换 ...
- scala中的隐式转换、隐式参数和隐式类
scala中的隐式转换.隐式参数和隐式类 @(SCALA)[scala] scala中的隐式转换隐式参数和隐式类 一隐式转换 1示例 2隐式转换的条件 二隐式参数 1示例 三隐式类 1示例 隐式转换是 ...
- Scala 高阶函数(作为值的函数、匿名函数、闭包、柯里化)+隐式转换和隐式参数...
Scala高级特性 1. 学习目标 1.1. 目标一:深入理解高阶函数 1.2. 目标二:深入理解隐式转换 2. 高阶函数 2.1. 概念 Scala混合了面向对象和函数式的特 ...
- scala当中的文件操作、网络请求和隐式转换
scala当中的文件操作.网络请求和隐式转换 文件操作和网络请求 读取文件当中每一行的数据 读取词法单元和数字 读取网络资源.文件写入.控制台操作 读取网络资源 文件写入操作 控制台交互操作 scal ...
- C++类型转换:隐式转换和显式转换
目录 隐式转换 为什么要进行隐式转换 C++隐式转换的原则 C++隐式转换发生条件 隐式转换的风险 禁止隐式转换 显式转换 dynamic_cast static_cast const_cast re ...
- C++拾趣——类构造函数的隐式转换
之前看过一些批判C++的文章,大致意思是它包含了太多的"奇技淫巧",并不是一门好的语言.我对这个"奇技淫巧"的描述颇感兴趣,因为按照批判者的说法,C++的一些特 ...
- Scala _09样例类(case classes)隐式转换
样例类(case classes) 概念理解 使用了case关键字的类定义就是样例类(case classes),样例类是种特殊的类.实现了类构造参数的getter方法(构造参数默认被声明为val), ...
- C++定义隐式转换函数,将类转换为内部的一个成员变量
C++中单参数构造函数若不声明为explict,在合适的场合可以产生隐式转换:由成员变量类型转换为类类型. 下面的代码展示如何实现反向的转换: Code highlighting produced b ...
- scala入门-10 隐式转换、隐式参数、隐式类
到目前为止,隐式转换是scala的重点和难点了,加油~ 我们先创建一个类名称叫Implicit.scala 再看一个隐式参数的例子: 上面的例子中使用了隐式参数,我们也可以明显的指明参数: 下面看一下 ...
最新文章
- .NET Core IdentityServer4实战 第一章-入门与API添加客户端凭据
- Win7实用技巧之五库功能妙用
- c++-内存管理-G2.9
- Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果
- 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之完成登录功能...
- 使用 IIS 在 Windows 上托管 ASP.NET Core2.0
- xmpp muc 群聊协议 3
- js怎么图表在html中显示,使用Charts.js在HTML5中创建图表
- numpy生成服从特定分布(制定分布)的数据
- 计算机编译原理 张,计算机编译原理概念总结
- [2767]翻转排序 sdutOJ
- spring+mybatis 框架搭建
- java持久层用文件_JAVA中用三种方法将字符串持久化到文件中
- Java JSON转Excel工具类
- 人脸识别眨眼张嘴软件_手机端APP活体真活人检测扫描人脸识别SDK之张嘴摇头眨眼点头确认真人非...
- 链塔短评合集| XAS、ARDR为BB级,LSK为B级
- 宣州谢朓楼饯别校书叔云
- 算法图解第七章狄克斯特拉算法读书笔记
- Lighting - 光的亮度衰减
- 备考计算机考研,如何备考计算机考研?
热门文章
- 存储过程IN参数疑难问题解决方法【真正解决】
- [网络安全自学篇] 三十三.文件上传之绕狗一句话原理和绕过安全狗(六)
- App设计灵感之十二组精美的手机闹钟App设计案例
- HTML 限制 input 输入类型
- 【Linux系统编程】进程同步与互斥:POSIX有名信号量
- 【linux系统编程】进程间通信:信号中断处理
- java与spss交互,[转载]如何用SPSS做中介效应与调节效应(转)
- python去除视频马赛克_马赛克是否无法逆转?Python简单消除,看片无忧!
- python 面试题 2020_2020年最全python面试题
- python list删除元素_python中List添加、删除元素的几种方法