所谓类的隐式转换,就是将实参类型转成形参类型--如果不一致的话。

这个转换与基本类型转换不太一样,具体则是在形参类型的构造函数中使用实参类型的数据,从而构造出一个临时对象。

下面的代码,类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++ 类的隐式转换相关推荐

  1. C语言隐式/显式类型转换 | C++四种强制类型转换、类的隐式转换、explicit

    文章目录 C语言类型转换 隐式类型转换 显式类型转换 C++ 强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast 类的隐式类型转换 ...

  2. scala中的隐式转换、隐式参数和隐式类

    scala中的隐式转换.隐式参数和隐式类 @(SCALA)[scala] scala中的隐式转换隐式参数和隐式类 一隐式转换 1示例 2隐式转换的条件 二隐式参数 1示例 三隐式类 1示例 隐式转换是 ...

  3. Scala 高阶函数(作为值的函数、匿名函数、闭包、柯里化)+隐式转换和隐式参数...

    Scala高级特性 1.    学习目标 1.1.   目标一:深入理解高阶函数 1.2.   目标二:深入理解隐式转换 2.    高阶函数 2.1.   概念 Scala混合了面向对象和函数式的特 ...

  4. scala当中的文件操作、网络请求和隐式转换

    scala当中的文件操作.网络请求和隐式转换 文件操作和网络请求 读取文件当中每一行的数据 读取词法单元和数字 读取网络资源.文件写入.控制台操作 读取网络资源 文件写入操作 控制台交互操作 scal ...

  5. C++类型转换:隐式转换和显式转换

    目录 隐式转换 为什么要进行隐式转换 C++隐式转换的原则 C++隐式转换发生条件 隐式转换的风险 禁止隐式转换 显式转换 dynamic_cast static_cast const_cast re ...

  6. C++拾趣——类构造函数的隐式转换

    之前看过一些批判C++的文章,大致意思是它包含了太多的"奇技淫巧",并不是一门好的语言.我对这个"奇技淫巧"的描述颇感兴趣,因为按照批判者的说法,C++的一些特 ...

  7. Scala _09样例类(case classes)隐式转换

    样例类(case classes) 概念理解 使用了case关键字的类定义就是样例类(case classes),样例类是种特殊的类.实现了类构造参数的getter方法(构造参数默认被声明为val), ...

  8. C++定义隐式转换函数,将类转换为内部的一个成员变量

    C++中单参数构造函数若不声明为explict,在合适的场合可以产生隐式转换:由成员变量类型转换为类类型. 下面的代码展示如何实现反向的转换: Code highlighting produced b ...

  9. scala入门-10 隐式转换、隐式参数、隐式类

    到目前为止,隐式转换是scala的重点和难点了,加油~ 我们先创建一个类名称叫Implicit.scala 再看一个隐式参数的例子: 上面的例子中使用了隐式参数,我们也可以明显的指明参数: 下面看一下 ...

最新文章

  1. .NET Core IdentityServer4实战 第一章-入门与API添加客户端凭据
  2. Win7实用技巧之五库功能妙用
  3. c++-内存管理-G2.9
  4. Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果
  5. 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之完成登录功能...
  6. 使用 IIS 在 Windows 上托管 ASP.NET Core2.0
  7. xmpp muc 群聊协议 3
  8. js怎么图表在html中显示,使用Charts.js在HTML5中创建图表
  9. numpy生成服从特定分布(制定分布)的数据
  10. 计算机编译原理 张,计算机编译原理概念总结
  11. [2767]翻转排序 sdutOJ
  12. spring+mybatis 框架搭建
  13. java持久层用文件_JAVA中用三种方法将字符串持久化到文件中
  14. Java JSON转Excel工具类
  15. 人脸识别眨眼张嘴软件_手机端APP活体真活人检测扫描人脸识别SDK之张嘴摇头眨眼点头确认真人非...
  16. 链塔短评合集| XAS、ARDR为BB级,LSK为B级
  17. 宣州谢朓楼饯别校书叔云
  18. 算法图解第七章狄克斯特拉算法读书笔记
  19. Lighting - 光的亮度衰减
  20. 备考计算机考研,如何备考计算机考研?

热门文章

  1. 存储过程IN参数疑难问题解决方法【真正解决】
  2. [网络安全自学篇] 三十三.文件上传之绕狗一句话原理和绕过安全狗(六)
  3. App设计灵感之十二组精美的手机闹钟App设计案例
  4. HTML 限制 input 输入类型
  5. 【Linux系统编程】进程同步与互斥:POSIX有名信号量
  6. 【linux系统编程】进程间通信:信号中断处理
  7. java与spss交互,[转载]如何用SPSS做中介效应与调节效应(转)
  8. python去除视频马赛克_马赛克是否无法逆转?Python简单消除,看片无忧!
  9. python 面试题 2020_2020年最全python面试题
  10. python list删除元素_python中List添加、删除元素的几种方法