【C++基金会 06】explictkeyword

【C++基金会 06】explictkeyword

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

C++提供keywordexplicit,你应该不能阻止的转换构造隐式转换发生的同意。声明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型。则隐式调用构造函数时生成的瞬态对象不能传递。

版权声明:本文博主原创文章,博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117077.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 编码器原理_编码器使用方法

    编码器原理_编码器使用方法引用LQ的编码器原理1/概述  旋转编码器是用来测量转速的装置。它分为单路输出和双路输出两种。技术参数主要有每转脉冲数(几十个到几千个都有),和供电电压等。单路输出是指旋转编码器的输出是一组脉冲,而双路输出的旋转编码器输出两组相位差90度的脉冲,通过这两组脉冲不仅可以测量转速,还可以判断旋转的方向。编码器如以信号原理来分,有增量型编码器,绝对型编码器。 2/原理 增量型编码

    2022年10月1日
    5
  • java中JSONArray、JSONObject、List、String之间的转换「建议收藏」

    java中JSONArray、JSONObject、List、String之间的转换「建议收藏」一、JASSONArray转为JSONObject     JSONArrayresult_type=newJSONArray();       StringBuffercdsIdxType=newStringBuffer();       cdsIdxType.append("selectidfromtable_type");       result_type=…

    2022年6月3日
    44
  • 《前端运维》二、Nginx–1基本概念及安装

    一、Nginx基本概念简单来说,Nginx就是一个代理服务器,什么是代理服务器呢?也就是当我们访问服务器的时候,请求不会直接请求到服务器,中间会有个代理,代理会预先于服务器处理这些请求,最后由代理决

    2022年3月25日
    43
  • PLSQ编程

    PLSQ编程

    2021年8月23日
    49
  • byte与word的区别_女生类型分类

    byte与word的区别_女生类型分类在Visual C++ 6.0中,BYTE与WORD,DWORD本质上都是一种无符号整型,它们在WINDEF.H中被定义,定义如下:typedef unsigned char BYTE;typedef unsigned short WORD;typedef unsigned long DWORD;也就是说BYTE是无符号的char型(char型本质上也是一…

    2022年8月18日
    6
  • hbase开启thrift2

    hbase开启thrift2

    2021年11月27日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号