与算术类型相比,类的转换更复杂。因为算术转换只涉及到精度的问题,而类对象的转换却涉及到能否转换以及怎样转换的问题。
隐式转换就是隐式转换,它会出现在你没有注意的地方。参看以下代码:
class CMyInt
{
public:
CMyInt();
CMyInt(int i);
~CMyInt();
private:
int m_i;
};
CMyInt::CMyInt()
{
m_i = 0;
cout << "无参数构造(默认0)" << endl;
}
CMyInt::CMyInt(int i)
{
m_i = i;
cout << "从整数构造,值为" << i << endl;
}
CMyInt::~CMyInt()
{
cout << "析构" << m_i << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
CMyInt a;
a = 3;
return 0;
}
执行以上代码会发现,程序中有两次构造与两次析构,原因是“a = 3;”这个赋值表达式要将右边的类型转换为左边的类型。而这个转换是通过调用构造函数来进行的。
不过,以上代码只是测试用的,读者们千万不要在实际工作中写这样的代码。因为这样做是很不科学的。“a = 3;”这样的表达式,只要CMyInt类提供了右值类型为int的赋值操作符重载,就可以避免使用构造函数来进行转换。操作符重载代码如下:
在类定义的public段添加一行:“CMyInt& operator = (const int i);”然后在类定义外部添加以下代码:
CMyInt& CMyInt::operator = (const int i)
{
m_i = i;
cout << "operator =" << i << endl;
return *this;
}
加了以上代码,同样是“a = 3;”就不使用类型转换了,改为使用赋值操作。我写下以上这段程序的目的只是验证VC++中会有类对象的转换,它们与算术类型的转换差不多:生成一个合适的临时对象,参与运算以后再把临时对象释放掉。
本站文章皆为作者原创,其它媒体(包括但不限于报刊、杂志、网站、电视、电台)未经作者书面许可严禁转载(或部分摘录)!
