码迷,mamicode.com
首页 > 编程语言 > 详细

【C++基础 06】explict关键字

时间:2014-07-30 23:59:25      阅读:492      评论:0      收藏:0      [点我收藏+]

标签:c++   ecplicit   

C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。

1.示例

我们先来看一段示例代码:

class A
{
public:
  A(int v):var(v){};//带一个int型值的构造函数
  bool isSame(const A& ref) const {return var == ref.var;}//判等函数
private:
  int var;//成员变量var
};

void main()
{
  A a(5);//构造a对象
  A b(5);//构造b对象
  if (a.isSame(b))
    cout<<"a==b"<<endl;
  else
    cout<<"a!=b"<<endl;
}

上述代码获得结果是a==b。如果A b(3),获得的结果就是a!=b。

2.构造函数定义引起的隐式转换

由于构造函数需要传入一个int型初始值,因此可以认为这是一个隐式转换,把一个int型值转换为一个A类型的对象。所以如果修改main函数为如下代码。

class A
{
public:
  A(int v):var(v){};//带一个int型值的构造函数
  bool isSame(const A& ref) const {return var==ref.var;}//判等函数
private:
  int var;//成员变量var
};

void main()
{
  A a(5);//构造a对象
  if (a.isSame(5))//这里会因为构造函数的隐式转换,因而正确执行isSame 
    cout<<"a==b"<<endl;
  else
    cout<<"a!=b"<<endl;
}
这看起来不错,好像还省了不少力气,但是这样的使用依赖于用户是否有相应的需求,有时候它将成为一个bug。所以更好的办法是抑制这种由构造函数引起的隐式转换。

3.抑制抑制由构造函数定义的隐式转换

在构造函数中引入explicit可以帮我们解决这个问题。

class A
{
public:
  explicit A(int v):var(v){};//带一个int型值的构造函数
  bool isSame(const A& ref) const {return var==ref.var;}//判等函数
private:
  int var;//成员变量var
};

void main()
{
  A a(5);//构造a对象
  if (a.isSame(5))
    cout<<"a==b"<<endl;
  else
    cout<<"a!=b"<<endl;
}
//输出结果
error C2664: “A::isSame”: 不能将参数 1 从“int”转换为“const A &”  
1>        原因如下: 无法从“int”转换为“const A”  
1>   
这样一来构造函数就无法进行隐式转换,

4.为转换进行显式使用构造函数

这时候仍想进行转换的话,显式使用构造函数吧。

class A
{
public:
  explicit A(int v):var(v){};//带一个int型值的构造函数
  bool isSame(const A& ref) const {return var==ref.var;}//判等函数
private:
  int var;//成员变量var
};

void main()
{
  A a(5);//构造a对象
  if (a.isSame(A(5))//显示使用构造函数
    cout<<"a==b"<<endl;
  else
    cout<<"a!=b"<<endl;
}

5.总结

除非有明显的理由想利用构造函数定义的隐式转换,否则设置explicit可以避免一些错误,当需要进行转换的时候,由用户显式地调用构造函数。当然C++的临时对象都是const,如果isSame函参不是const型,则隐式调用构造函数时生成的临时对象也无法传入。


【C++基础 06】explict关键字,布布扣,bubuko.com

【C++基础 06】explict关键字

标签:c++   ecplicit   

原文地址:http://blog.csdn.net/shun_fzll/article/details/38307479

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!