Posted on 2009-06-18 23:24
forlan 阅读(142)
评论(0) 编辑 收藏 引用
//下面针对explicit写个简单的类
class myexplicit
{
public:
explicit myexplicit(int i) {}
explicit myexplicit(const myexplicit& rhs) {}
virtual ~myexplicit() {}
private:
int m_i;
};
//下面是VC8的测试程序
int main(array<System::String ^> ^args)
{
myexplicit tmp1(1); //pass
myexplicit tmp2 = 2; //error
myexplicit tmp5(tmp2); //pass
myexplicit tmp6 = tmp2; //error
return 0;
}
你可能会发牢骚了,我都写了constructor,都写了copy constructor的啊?!
explicit myexplicit(int i) {}
explicit myexplicit(const myexplicit& rhs) {}
没错,的确是写了,但带上了explicit。
explicit按字面意思是明确的,显式的,那什么算是explicit呢?什么又是implicit的呢?
myexplicit tmp2(2); //explicit
myexplicit tmp3 = 3; //implicit
myexplicit tmp5(tmp2); //explicit
myexplicit tmp6 = tmp2; //implicit
其实implicit除了这样,还有另外的2种的,参数和返回值。
void func1(myexplicit tmp)
{
}
myexplicit func2( )
{
return 2;
}
int main(array<System::String ^> ^args)
{
func1(1);
myexplicit tmp2 = func2();
return 0;
}
如果不是编译器报错,你是否会对上面的代码发出“函数的形参和实参不一样啊!”这样的惊讶?
呵呵,很多人都不理解,既然这样的代码
myexplicit tmp3 = 3;
你是可以接受的,那为什么参数的代码就不能接受呢?
下次看到公司的代码满布explicit的时候,你应该够冷静的了。
如果不想implicit转换,请写上explicit。