博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【c++】explicit 隐式类类型转换
阅读量:6833 次
发布时间:2019-06-26

本文共 1873 字,大约阅读时间需要 6 分钟。

上代码

#include 
#include
using namespace std;class A { public: A(const string &book = "ab") : s(book) {} int same_s(const A &a) const { return s == a.s; } private: string s;};int main(int argc ,char **argv){ A c("aaa"); string m = "aaa"; cout << c.same_s(m) << endl;}

 

究其因

same_s应该接收一个类A的对象参数,但是这里直接传了一个字符串对象。过程这样:编译器接收一个string的对象,利用构造函数 A(const string &book = "ab") 生成临时对象(隐性转换),然后传递给same_s,临时对象失效.

 注意: explicit 只能用于类内部的构造函数的声明上。

explicit和构造函数一起使用.

explicit constructor指明构造函数只能显式使用,目的是为了防止不必要的隐式转化.

如何防止隐性转换

构造函数加关键字explicit

#include 
#include
using namespace std;class A { public: explicit A(const string &book = "ab") : s(book) {} int same_s(const A &a) const { return s == a.s; } private: string s;};int main(int argc ,char **argv){ A c("aaa"); string m = "aaa"; cout << c.same_s(m) << endl;}

 

结果出错

 

解决之道

字符串强制传递给构造函数

#include 
#include
using namespace std;class A { public: explicit A(const string &book = "ab") : s(book) {} int same_s(const A &a) const { return s == a.s; } private: string s;};int main(int argc ,char **argv){ A c("aaa"); string m = "aaa"; cout << c.same_s(A(m)) << endl;}

 

同理

对于 A a = string("hello")来说,如果参数为string的构造函数为explicit,则这样初始化是错误的;如果不是explicit,则这样初始化是正确的(先利用构造函数生成临时对象,再把临时对象通过赋值操作符复制到新创建的对象上)。

 

对比实验

 

#include 
#include
using namespace std;class A { public: A(const string a) : s(a) {} private: string s;};int main(int argc ,char **argv){ A a = string("hello");} 

#include 
#include
using namespace std;class A { public: explicit A(const string a) : s(a) {} private: string s;};int main(int argc ,char **argv){ A a = string("hello");}

  

转载地址:http://yftkl.baihongyu.com/

你可能感兴趣的文章
[转]关于strtok和strtok_r函数的深度研究
查看>>
ios-自定义点击状态栏滚回顶部
查看>>
Django现有模型增加字段
查看>>
解决IE6浏览器下position:fixed固定定位问题
查看>>
Rest分页接口开发
查看>>
Mybatis中oracle如何批量insert语句
查看>>
org.aspectj.lang.JoinPoint-中文简要API(转)
查看>>
面向对象知识
查看>>
数据库中算式的简单例子
查看>>
AVFoundation自定义拍照
查看>>
测试显示GitHub的Gist
查看>>
JavaScript学习——JavaScript基础
查看>>
JSP学习-07Cookie 与Session
查看>>
对对象使用[]的方式使用属性的一个例子的理解
查看>>
MS .NET企业级应用架构设计笔记1(关于业务层)
查看>>
【Codeforces Round #406 (Div. 2)】题解
查看>>
php基本语法
查看>>
页面加载顺序的问题
查看>>
防止人为误操作MySQL数据库技巧一例
查看>>
送给自己的春节回家最佳高薪充电技术
查看>>