【C++基础之十七】抑制由构造函数定义的隐式转换
来源:互联网 发布:漆黑优化速度插件下载 编辑:程序博客网 时间:2024/05/17 04:12
原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/17006543
有时候构造函数的隐式转换可以帮我们不少忙,但有时候它也会帮倒忙。所以我们应该要控制它,而不是让它无脑操作。
1.示例
先看一段代码。
#include "stdafx.h"using namespace std;class A{public:A(int v):var(v){};//带一个int型值的构造函数bool isSame(const A& ref) const {return var==ref.var;}//判等函数private:int var;//成员变量var};int _tmain(int argc, _TCHAR* argv[]){A a(5);//构造a对象A b(5);//构造b对象if (a.isSame(b))cout<<"a==b"<<endl;elsecout<<"a!=b"<<endl;}
代码定义了类A,包含一个int型成员变量var,构造函数需要传入var的初始值,isSame函数用于判断2个类A的对象是否相等(通过判断成员变量var值)。上述代码获得结果是a==b。如果A b(3),获得的结果就是a!=b。
2.构造函数定义引起的隐式转换
由于构造函数需要传入一个int型初始值,因此可以认为这是一个隐式转换,把一个int型值转换为一个A类型的对象。所以如果修改main函数为如下代码。
int _tmain(int argc, _TCHAR* argv[]){A a(5);//构造a对象if (a.isSame(5))//这里会因为构造函数的隐式转换,因而正确执行isSamecout<<"a==b"<<endl;elsecout<<"a!=b"<<endl;}这看起来不错,好像还省了不少力气,但是这样的使用依赖于用户是否有相应的需求,有时候它将成为一个bug。所以更好的办法是抑制这种由构造函数引起的隐式转换。
3.抑制抑制由构造函数定义的隐式转换
在构造函数中引入explicit可以帮我们解决这个问题。
class A{public:explicit A(int v):var(v){};//引入explicit关键字bool isSame(const A& ref) const {return var==ref.var;}private:int var;};int _tmain(int argc, _TCHAR* argv[]){A a(5);if (a.isSame(5))cout<<"a==b"<<endl;elsecout<<"a!=b"<<endl;}看看结果:
error C2664: “A::isSame”: 不能将参数 1 从“int”转换为“const A &”1> 原因如下: 无法从“int”转换为“const A”1> class“A”的构造函数声明为“explicit”好了,这样一来构造函数就无法进行隐式转换,
4.为转换进行显式使用构造函数
这时候仍想进行转换的话,显式使用构造函数吧。
int _tmain(int argc, _TCHAR* argv[]){A a(5);if (a.isSame(A(5)))//显式使用构造函数cout<<"a==b"<<endl;elsecout<<"a!=b"<<endl;}
5.总结
除非有明显的理由想利用构造函数定义的隐式转换,否则设置explicit可以避免一些错误,当需要进行转换的时候,由用户显式地调用构造函数。当然C++的临时对象都是const,如果isSame函参不是const型,则隐式调用构造函数时生成的临时对象也无法传入。
- 【C++基础之十七】抑制由构造函数定义的隐式转换
- C++ 抑制构造函数定义的隐式转换
- 读书笔记--抑制构造函数定义隐式转换
- c++:explicit 抑制构造函数隐式转换
- C++类中,explicit构造函数,抑制隐式转换
- C/C++日常学习总结(第十二篇)将构造函数声明为explicit(显式)的方式可以抑制隐式转换
- explicit只对构造函数起作用,用来抑制隐式转换
- explicit 只对构造函数起作用,用来抑制隐式转换
- C++中的explicit关键字 抑制隐式转换构造
- (转)C++笔记(1)explicit 只对构造函数起作用,用来抑制隐式转换。
- More Effective C++----(4)避免无用的缺省构造函数 & (5)谨慎定义类型转换函数
- (C++)定义类的拷贝构造函数
- C++类的定义之构造函数
- c++-转换构造函数
- C++ 学习之构造函数:构造函数小结3 默认构造函数、隐式类型转换和复制构造函数
- C++ 学习之构造函数:构造函数小结3 默认构造函数、隐式类型转换和复制构造函数
- C++ 学习之构造函数:构造函数小结3 默认构造函数、隐式类型转换和复制构造函数
- 【c/c++】转换构造函数
- android gallery photoview分析
- android NDK 使用第三方静态库
- android wifi display
- Linux内核编程初体验 —— hello world
- uc mobile 8.XX 以下,怎样访问内网
- 【C++基础之十七】抑制由构造函数定义的隐式转换
- Android View.onMeasure方法的理解
- Hash树
- $CI =& get_instance();
- tcp三次握手和四次挥手
- 常见10种算法
- HDU 2594 Simpsons’ Hidden Talents KMP的next数组应用
- 会计,你该如何面对新科技?
- 在Python中使用protocol buffers参考指南