C++的explicit和隐式转换

2023-12-02 11:01:54 浏览数 (2)

隐式转换是指在某些情况下,编译器会自动进行类型转换,将一种类型的值转换为另一种类型,以满足表达式的要求。这种转换是隐式进行的,不需要显式地调用转换函数或构造函数。

代码语言:javascript复制
int a = 5;
double b = a;  // int 到 double 的隐式转换

上面这个转换是没有什么问题的,但是下面这个隐式转换就,怎么说,也是可以转换的

 可以通过隐式调用带参构造函数进行转换,将基本类型转换为自定义类类型

代码语言:javascript复制
#include<iostream>
using namespace std;
class Me{
private:
    int number;
public:
    Me(int n):number(n){}
};
int main() {
    Me me=1;
}

多个参数也是可以的

代码语言:javascript复制
#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来禁止隐式类型转换

如下这个代码就有语法错误了

代码语言:javascript复制
#include<iostream>
using namespace std;
class Me{
private:
    int number;
public:
    explicit Me(int n):number(n){}
};
int main() {
    Me me=1;
}

explicit修饰使得该构造函数只能被显式调用,而不能被隐式调用,这样可以防止意外的隐式类型转换,明确代码意图

0 人点赞