一.概述

C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的;

跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).

二.代码示例:

1.代码一

class MyClass {

public:

    int va;

    explicit MyClass(int value) {

    // MyClass(int value) {

        qDebug()<<"This is MyClass"<<value ;

        va = value;

    }

};

void someFunction(MyClass obj) {

    qDebug()<<"This is someFunction" << obj.va;

}

(1)测试一:  

int main() {  

    int x = 10;  

    someFunction(x); // 这行代码会编译错误,因为MyClass的构造函数是explicit的

    someFunction(MyClass(x)); // 这行代码是正确的,显式地调用构造函数  

    return 0;  

}

输出错误:error: could not convert 'x' from 'int' to 'MyClass'

                 ^

(2)测试二

    int main() {  

    int x = 10;  

    //someFunction(x); // 这行代码会编译错误,因为MyClass的构造函数是explicit的

    someFunction(MyClass(x)); // 这行代码是正确的,显式地调用构造函数  

    return 0;  

}

输出正常:

This is MyClass 10

This is someFunction 10

2.代码二

class MyClass {

public:

    int va;

    //explicit MyClass(int value) {

    MyClass(int value) {

        qDebug()<<"This is MyClass"<<value ;

        va = value;

    }

};

void someFunction(MyClass obj) {

    qDebug()<<"This is someFunction" << obj.va;

}

(1)测试一:  

int main() {  

    int x = 10;  

    someFunction(x); // 输出正常,进行隐式转换

    someFunction(MyClass(x)); // 这行代码是正确的,显式地调用构造函数  

    return 0;  

}

输出正常:

This is MyClass 10

This is someFunction 10

This is MyClass 10

This is someFunction 10

三.注意

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

04-24 05:56