#include<iostream>
#include<string>
#include<fstream>
using namespace std;
ofstream out("test.out");
class A
{
public:
string id;
A(string iid=""):id(iid){out<<"A(),iid="<<iid<<endl;}
A(const A& a) {id=a.id+"copy";out<<"A(const A& a),iid="<<id<<endl;}
A& operator=(const A& rv)
{
id=rv.id;
return *this;
}
A f1(){return *this;}
A& f2(){return *this;}
A& f3(){A* pb=new A; return *pb;}
};
A& f()
{
A a("a");
cout<<"in f():"<<&a<<endl;
return a;
}
int main()
{
A a("a");
cout<<"&a:"<<&a<<endl;
cout<<"f1():"<<&(a.f1())<<endl;
cout<<"f2():"<<&(a.f2())<<endl;
A b=a.f2();
cout<<"&b:"<<&b<<endl;
cout<<"f3():"<<&(a.f3())<<endl;
cout<<"in main f():"<<&(f())<<endl;
return 0;
}

從輸出可以看出:
對象a的起始地址與函數f2()的返回值地址相同,f2()的返回為引用;
對象b的地址與對象a的地址不同,兩個對象在內存中占有獨立的空間,利用返回的引用類型初始化b,而不是在內存中再生成一個a對象的副本,然后再初始化b;
對象a的起始地址與函數f1()的返回值地址不相同,f1()的返回不是引用,在內存中生成了一個對象a的副本;
函數f()返回局部對象的引用是會有警告的,因為函數返回后,局部變量的內存將被釋放,選用這個例子只是為了測試編譯器在返回是臨時對象的引用時是怎樣處理的。可以看出,即使是返回一個臨時對象的引用,編譯器也不會為了確保安全而生成一個臨時對象返回。
