隐式转换是指在某些情况下,编译器会自动进行类型转换,将一种类型的值转换为另一种类型,以满足表达式的要求。这种转换是隐式进行的,不需要显式地调用转换函数或构造函数。
int a = 5;
double b = a; // int 到 double 的隐式转换
上面这个转换是没有什么问题的,但是下面这个隐式转换就,怎么说,也是可以转换的
可以通过隐式调用带参构造函数进行转换,将基本类型转换为自定义类类型
#include<iostream>
using namespace std;
class Me{
private:int number;
public:Me(int n):number(n){}
};
int main() {Me me=1;
}
多个参数也是可以的
#include<iostream>
using namespace std;
class Me{
private:int number;string name;
public:Me(int n,string name):number(n),name(name){}
};
int main() {Me me={1,"yemaolin"};
}
但有时候我们希望禁止隐式类型转换,要求显式地调用构造函数进行类型转换,这就需要调用explicit来禁止隐式类型转换
如下这个代码就有语法错误了
#include<iostream>
using namespace std;
class Me{
private:int number;
public:explicit Me(int n):number(n){}
};
int main() {Me me=1;
}
explicit修饰使得该构造函数只能被显式调用,而不能被隐式调用,这样可以防止意外的隐式类型转换,明确代码意图