5.explicit关键字

    首先,explicit表示显示的、明确的意思,与隐式的意思相反,在C++11之前,存在如下图左的隐式转换,Complex的构造函数带两个参数,但一个已经带了初值,且此处无explicit关键字,因此它实际上就是一个non-explicit, one argument constructor(无exp关键字,仅需一个实参的构造函数),此时在执行如下的c1+5时,首先调用+的操作符重载函数,然后在参数传递时,编译器会在编译期间默认调用其构造函数,将5转换为一个Complex类型的对象(re=5,im=0),因为Complex构造函数只需要一个实参,此时正好满足。

    因此,有的时候为了禁止这种隐式转换,在C++11之前,采用下图右侧这种方式,加上一个explicit关键字,这个时候Complex构造函数就变成了explicit and one argument constructor(有exp关键字,只需要一个实参的构造函数),此时再次执行c1+5时,编译器报错(没有和operator+匹配的重载函数)。

下面是C++11中explicit的新特性,它将作用于需多个实参的构造函数(而非旧版本中只有一个实参的构造函数),从下图左的执行结果中看出(注释后面是执行结果),p5={77,5,42}以及下面一个报错,原因就是代码中P(int a,int b,int c)前加了explicit关键字,这里本来编译器默认会进行隐式转换(将以{77,5,42}一包形式的initializer_list转换成(int a ,int b, int c)),加上explicit就不允许隐式转换,因此报错。这里与旧版区别在于,新版的支持多个参数的构造函数,旧版只支持单个构造函数。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值