标签:需要 承担 xxx 函数 str ros xpl 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;
}
标签:需要 承担 xxx 函数 str ros xpl explicit 第一个
原文地址:https://www.cnblogs.com/tongyishu/p/13289171.html