posts - 3,  comments - 0,  trackbacks - 0

Type func() {
      ....
}
obj = func() // 该过程中会生成临时变量。这个变量是由编译器生成的,没有显式地在C++代码中体现出来

除非特别注意,或者C++一直拿在手上,这些问题非常容易犯错
因为返回对象的生命周期在函数出去时已经结束,为了完成赋值,必须要拷贝复制一份到函数堆栈。。。
这个临时对象不是命名对象。。。。

如果返回的是引用 &,则不会生成新的对象。

另外一种临时对象则是更为诡异的,下面的程序非但编译没有出错,居然还调用了构造函数生成临时对象。(C++为了编译不出错,会尽可能查找合适的转换路径,以满足编译需要。)
如下程序中,编译器就自动生成了赋值操作符,类型转换,以及类型转换的中间结果。

#include <iostream>
using namespace std;

class Rational
{
public:
 Rational(int a=0, int b=1) : m(a), n(b) {
  cout << "initailized..." << endl;
 }
private:
 int m, n;
};

int main()
{
 Rational r;
 r = 100;  // 居然没有编译出错
 return 0;
}


posted on 2009-10-27 03:00 thinke365 阅读(64) 评论(0)  编辑 收藏 引用 所属分类: C++ Pitfalls

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理