創建對象,我正在學習如何操縱與C函數對象++,到目前爲止,我已經得出以下觀點:功能在C++
如果你的對象是潛在的大,不讓它一局部變量,即將其保存在堆中以節省複製時間。
具體來說,我感興趣的是我們正在使用一個函數來創建一個以前不存在的對象的場景。 我已經把下面的小例子來展示該怎麼做,如果你有一個函數:
#include <iostream>
using namespace std;
struct obj {
int first;
int second;
};
void setFirstVersionA(int a, obj * s)
{
s->first = a;
}
obj * setFirstVersionB(int a)
{
//in Version B I am creating a new object in the function but have to run delete outside
obj * s = new obj();
s->first = a;
return s;
}
int main(int argc, const char** argv)
{
obj * myobj = new obj();
setFirstVersionA(2,myobj);
//now I have the new obj in *i
cout << myobj->first;
delete myobj;
//this is an alternative to passing a pointer directly:
//no need to re-declare the pointer as delete only erases the myobj data
myobj = setFirstVersionB(3);
//now I have the new obj in *i
cout << myobj->first;
delete myobj;
return 0;
}
據我所知,這兩個功能實現同樣的結果。
我喜歡版本A更好,因爲它不會區分新聲明和刪除聲明,並且使得我完成後不會輕易忘記刪除對象。但是它是一個返回類型void,我發現代碼的可讀性較差,因爲我必須真正檢查函數的功能(通常它意味着讀取其他文件)。
我更喜歡版本B,因爲它返回了我想改變的「事情」。所以我立即知道,這個函數改變了那個人(在這個例子中是obj)。但它分開,新建和刪除。誠實地說,我發現比在我的代碼中有一系列無效函數並沒有立即看到他們做什麼更可怕。 另外,這裏寫了很多關於不返回指向局部變量的指針,但是在變體B中,儘管對象是在函數內創建的,但它不是局部變量(因爲它位於堆中)。對?
有沒有更好的方法來做到這一點?另外,「創建一個以前不存在的對象的函數」聽起來很像構造函數。 :)我應該可能創建一個類與我的每個對象的構造函數?
感謝您的諮詢!
您應該閱讀關於智能指針,以及關於通過引用傳遞對象。 – Antonio
您應該詳細閱讀[返回值優化](http://en.wikipedia.org/wiki/Return_value_optimization),並且C++ 11移動語義。 – juanchopanza
此外,顯然,從@安東尼所說的,你還應該檢查RVO和NRVO。順便說一下,如果你的可讀性問題可以從第一個函數返回,那麼你總是可以返回'obj *'。 – lapk