c++ 隐式转换(explicit与转换构造函数)

由转换造函数进行的类型转换称为隐式转换,由类型转换运算符进行的转换称为显式转换

当一个构造函数只有一个参数,而且该参数又不是本类的const引用时,这种构造函数称为转换构造函数,即转换构造函数为单参构造函数的一种。

只有类的转换构造函数和类型转换操作符函数才可以被声明为explicit,当explicit用于类型转换操作符运算时,意味着禁止所有显式的类型转换

explicit不可以被继承,因为子类和父类的构造函数之间是调用关系,而非继承。

单参构造函数的功能:

在c++中,单参构造函数(或者除了第一个参数外其余参数都有默认值的多参数构造函数)承担了两个角色:一是构造器,二是默认且隐含的类型转换操作符(转换构造函数

当我们在写 YYY = XXX 这样的代码,且XXX的类型恰好是YYY单参构造器的参数类型,这时候编译器就自动调用这个构造器,创建一个YYY对象。

如果我们不想使用这个默认且隐含的类型转换功能,就需要在类的单参构造器前面加上 explicit 修饰指定这个构造器只能被显示调用,不能作为类型转换操作符被隐含地使用。

示例:

class Integer1 {
public:
    int data;
    Integer1(int data) { this->data = data; }
};

class Integer2 {
public:
    int data;
    explicit Integer2(int data) { this->data = data; }
};

int main()
{
    Integer1 v1 = 3; // 隐式地调用其构造函数,success
    Integer2 v2 = 3; // 编译错误,不能隐式地调用其构造函数
    Integer2 v3(2); // 显示调用构造函数,sucess
    return 0;
}
原文地址:https://www.cnblogs.com/tongyishu/p/13289171.html