一.概述
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关键字也就无效了。
本文结束~
你的点赞和关注是对我最大的支持也是持续创造的动力~
感谢阅读,再会~