C++关键字explicit

在只有一个参数的构造函数时,直接对一个对象做赋值操作”=”, 有可能会执行一个隐式
转换,即调用只要一个参数的构造函数。这个过程是自动进行的,而不需要显式强制装换

C++提供了关键字 explicit,关闭了这种特性,则只可以显式转换。

如果不关闭这个特性,还有可能会执行以下的转换(以下面的my_class1为例子:
1. 将my_class1对象初始化为int类型时
1. 将int值赋值给my_class1对象时
1. 将int值传递给接收my_class1参数的函数时
1. 返回值被声明为my_class1的函数试图返回int值
1. 上述任意一种情况下,使用可转换为int类型的内置类型时

具体例子:

#include <iostream>
#include <string>

using namespace std;

class my_class1
{
public:
    my_class1() {
        mem_ = 0;
    }

    my_class1(int a) {
        mem_ = a;
    }

    void display() {
        cout << "mem_ = " << mem_ << endl;
    }

private:
    int mem_;
};

class my_class2
{
public:
    my_class2() {
        mem_ = 0;
    }

    explicit my_class2(int a) {
        mem_ = a;
    }

    void display() {
        cout << "mem_ = " << mem_ << endl;
    }

private:
    int mem_;
};


int main()
{
    my_class1 a;
    a.display();

    my_class1 b;
    b = 3;
    b.display();

    my_class2 c;
    c.display();

    /* Not allow
    my_class2 d;
    d = 4;
    d.display();
    */
}