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