本節舉例說明了函數返回一個對象的引用有很多坑,尤其是對這種operator*類的函數,因爲客戶可能會這麼寫:a*b*c,這樣,即使在堆上分配對象,也會陷入用戶無法對其調用delete的深坑,所以其實最簡單的做法就是直接by value返回一個新對象,這樣雖然你可以說效率不高,但是卻是最安全的做法。而關於效率的問題就交給編譯器吧,編譯器會決定是否對你的返回值進行優化(RVO)。
不在項目初期做性能優化。
結論:
絕不要返回pointer或reference指向一個local stack對象,或返回reference指向一個堆上的對象,或返回pointer或reference指向一個local static對象而有可能同時需要多個這樣的對象。
補充:
直接返回對象也要注意對象被切割的問題
class Base
{
public:
virtual void test() const
{
cout << "base.test()" << endl;
}
};
class Derive : public Base
{
public:
virtual void test() const override
{
cout << "Derive.test()" << endl;
}
};
Base create()
{
return Derive{};
};
int main()
{
Base b{ create() };
b.test(); // base.test()
return 0;
}
所以我覺得實際上行如果不是重載操作符之類的情況,返回一個堆上的引用或者指針本身沒有什麼問題,要看項目的實際需求了。