讀書筆記《Effective c++》 條款21 必須返回對象時,別妄想返回其reference


本節舉例說明了函數返回一個對象的引用有很多坑,尤其是對這種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;
}
所以我覺得實際上行如果不是重載操作符之類的情況,返回一個堆上的引用或者指針本身沒有什麼問題,要看項目的實際需求了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章