关于自动重载的问题
不太看得懂这个自动重载的程序。特别是函数g(1)的参数为什么可以是int??请高手帮忙解释,谢谢了!
class One{
int i;
public:
One(int ii=0,int=0):i(ii){}
};
class Two{
int x;
public:
Two(int xx):x(xx){};
operator One() const {return One(x);}
};
void g(One){}
int _tmain(int argc, _TCHAR** argv)
{
Two two(2);
g(two);
g(1);
}
[解决办法]
class One{
int i;
public:
explicit One(int ii=0,int=0):i(ii){} //加explicit, 要求只能显式调用
};
class Two{
int x;
public:
Two(int xx):x(xx){};
operator One() const {return One(x);}
};
void g(One){}
int _tmain(int argc, _TCHAR** argv)
{
Two two(2);
g(two);
g(1); //自动调用One的构造函数,编译失败,因为只能要求显式调用
g(One(1));//显式调用成功
}
[解决办法]
g(1)
因为
One(int ii=0,int=0):i(ii){}
所以
1 可以隐式转换成 One
[解决办法]
楼上的正解,
当你传一个整数的时候,编译器发现不是这个函数需要的参数,会对其进行类型转换。而此时,恰好可以通过One(1)
构造一个One对象出来.