在C++中,explicit关键字主要用于防止隐式转换(避免构造函数的参数自动转换为类对象的标识符),用于修饰构造函数、复制构造函数。
#include <iostream>
using namespace std;
class Test{
public:
Test(int i)
{
cout<<"构造函数"<<endl;
}
int data;
};
int main(int argc, char *argv[])
{
Test a = 10;
return 0;
}
例如上述代码:
首先Test a = 0这种写法肯定是错误的,可是编译器呢通过搜索发现A类对象构造函数可以通过int来构造,而且
Test(int i)并没有被explicit修饰,所以Test a = 0会为0生成一个对象,然后将对象赋值给a
假如我们稍作改动假如explicit修饰,如下
#include <iostream>using namespace std;class Test{public:
explicit Test(int i){
cout<<"con"<<endl;}
int data;};int main(int argc, char *argv[]){Test a = 10;return 0;}
编译报错
如下
C:\Users\Administrator\Desktop\c++_test\explict\main.cpp:17: error: conversion from 'int' to non-scalar type 'Test' requested
Test a = 10;
^
加入explicit后a = 10相当于a.operator = (10),a对象怎么会等于10呢?所以便报错了