加explicit前
class c1
{
public:
int a;
c1(int a)
{
this->a = a;
}
};
class c2
{
private:
int a;
public:
c2(c1 c)
{
this->a = c.a;
}
};
int main(int argc,char *argv[])
{
c2 c(1);//可以正常编译
}
加explicit后
class c1
{
public:
int a;
explicit c1(int a)
{
this->a = a;
}
};
class c2
{
private:
int a;
public:
c2(c1 c)
{
this->a = c.a;
}
};
int main(int argc,char *argv[])
{
c2 c(1);//报错
}
代码1能正常执行的原因是因为c2 c(1)的过程中将1通过调用c1的构造函数隐式转换成了c1对象,加explicit后编译器不再允许隐式转换,需要通过显式转换来通过编译
c2 c(c1(1));