Cpp关键字破解(四)【explicit】篇

关键字总结-explicit

0 - 前言

参考:

C++ explicit关键字详解

C/C++:explicit关键字

[C++ 中explicit的作用](https://www.cnblogs.com/diligenceday/p/5781408.html)

1 - 含义

explicit关键字用来防止隐式调用构造函数。既然如此,那么explicit就是修饰类的构造函数的。explicit 关键字只能用于类内部的构造函数声明上

类构造函数默认情况下即声明为implicit(隐式)

什么叫做隐式调用构造函数呢?既然有隐式,就必然有显式调用构造函数,来看一个例子:

class A{
public: 
    A(int a)//
    {cout<<a<<endl;}
};
class B{
public: 
    explicit B(int b)
    {cout<<b<<endl;}
};
int main(){
    //构造函数默认 隐式调用
	A A1(12);	//显式调用构造函数
    A A2 = 23;	//隐式调用构造函数
    A1 = 45;	//允许,隐式
    A2 = A1;	//允许,隐式
    //构造函数使用explicit修饰,只允许显示调用构造函数
    B B1(12);	//显式
    //B B2 = 23;//这样就是不允许的
    //B1 = 45;//不允许,取消隐式
    //B2 = B1;//不允许,取消隐式
    return 0;
}

2 - 适用场景

explicit关键字只对有一个参数的类构造函数有效, 如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 所以explicit关键字也就无效了

class B{
public: 
    explicit B(int b1, int b2)
    {cout<<b<<endl;}
};
//此时有无explicit都一样,不会发生隐式转换

也有一个例外, 就是当除了第一个参数以外的其他参数都有默认值的时候, explicit关键字依然有效, 此时, 当调用构造函数时只传入一个参数, 等效于只有一个参数的类构造函数,看例子:

class B{
public: 
    explicit B(int b1, int b2 = 0)
    {cout<<b<<endl;}
};
//此时,仍旧要依靠explicit来区分是否允许因式转换
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值