一级棒(Eachfun)
一级棒 - 读书笔记 - C++ Primer - 类对象的隐式转换
RSS订阅
类对象的隐式转换
发表时间:2006-07-20 22:09:55 关键词:C++,MFC,VC,Primer,编程,教程,读书

  与算术类型相比,类的转换更复杂。因为算术转换只涉及到精度的问题,而类对象的转换却涉及到能否转换以及怎样转换的问题。
  隐式转换就是隐式转换,它会出现在你没有注意的地方。参看以下代码:
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++中会有类对象的转换,它们与算术类型的转换差不多:生成一个合适的临时对象,参与运算以后再把临时对象释放掉。

本站特约顾问律师常州东晟律师事务所朱立律师(电话13915029670,QQ646146109)提醒您:
本站文章皆为作者原创,其它媒体(包括但不限于报刊、杂志、网站、电视、电台)未经作者书面许可严禁转载(或部分摘录)!
发表评论
称呼:
QQ:
邮箱:
链接:
内容:
搜索: 百度搜索 Google搜索
Copyright©2000 - 2008 Eachfun.Com, All Rights Reserved 一级棒网络
苏ICP备05080156号
一级棒建站系统 http://www.eachfun.com 一级棒版权所有,未经许可不得商用!