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来区分是否允许因式转换

猜你喜欢

转载自blog.csdn.net/weixin_44484715/article/details/114931123