【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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • OJ提交结果的整理

    OJ提交结果的整理

    2021年8月18日
    43
  • anycast隧道_一种以anycast方式部署的CDN监控可用性的方法与流程

    anycast隧道_一种以anycast方式部署的CDN监控可用性的方法与流程本发明涉及一种CDN节点监控可用性的方法,具体涉及一种以anycast方式部署的CDN监控可用性的方法。背景技术:现有CDN可用性的检测方法,一般通过一些探测点检测目的CDN的可用性,在探测到失败时,认为目的CDN不可用;对于以anycast方式部署的CDN监控,得到的结果是不准确的;因为多个探测点发出的探测数据不一定到达了所有的目的CDN;导致探测数据未到达的CDN实际上没有被监控到。技术实现要…

    2022年5月10日
    36
  • bgr2gray_tarjan算法

    bgr2gray_tarjan算法概述项目中用到yuvNV12转BGR24的算法,总结了几种常用算法代码如下。直接转换//NV12转BGRvoidNV12_T_BGR(unsignedintwidth,unsignedintheight,unsignedchar*yuyv,unsignedchar*bgr){constintnv_start=wi…

    2022年9月16日
    1
  • centos关闭自动休眠_7P怎么强制重启

    centos关闭自动休眠_7P怎么强制重启taskkill/F/imnginx.exetaskkill/F/imnginx.exed:cdD:\phpstudy_pro\Extensions\Nginx1.15.11startnginx.exe然后做个计划任务。一个小时重启一次

    2022年8月13日
    2
  • Python爬取豆瓣电影Top250并进行数据分析

    Python爬取豆瓣电影Top250并进行数据分析Python数据分析–豆瓣电影Top250利用Python爬取豆瓣电影TOP250并进行数据分析,对于众多爬虫爱好者,应该并不陌生。很多人都会以此作为第一个练手的小项目。当然这也多亏了豆瓣的包容,没有加以太多的反爬措施,对新手比较友好。版权声明:本文为博主原创文章,创作不易本文链接:数据爬取翻页操作第一页:https://movie.douban.com/top250第二页:https://movie.douban.com/top250?start=25&filter=第三页

    2022年6月1日
    55
  • 移动硬盘出现参数错误,无法访问的问题

    移动硬盘出现参数错误,无法访问的问题win7连接移动硬盘,使用过程中出现死机,强制重启电脑,开机后移动硬盘出现参数错误无法访问,百度后,尝试用win+r打开运行窗口,输入CHKDSKE:/F/R,其中E换成参数错误的盘符嗲,点击确

    2022年7月2日
    47

发表回复

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

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