2017-06-06 68 views
0

我是新的C++(從Java來)和我實際上與 struggeling以下: 讓FOO是類C++創建的對象與一個數組作爲構件

int bar[10] = {}; 

Foo::Foo() 
{ 
    bar[1] = 42; 

} 

和doSmth()在主類中的方法:

Foo doSmth(){ 
Foo f; 
f.bar[0] = 10; 
return f; 
} 

主要會是這樣的:

int main(int argc, char *argv[]) 
{ 
Foo f = doSmth(); 

cout << f.bar[1] << endl; 
cout << f.bar[0] << endl; 
return 0; 
} 

這是否正確地返回foo - 對象doSmth()? 我想在堆棧上創建對象,但我擔心foo對象中的array (bar),它何時會從堆棧中刪除?

+1

爲什麼沒有註釋的downvote? – zipzit

回答

2

這是正確的方式返回doSmth()中的foo對象嗎?

當然是。

我想在堆棧

你必須創建對象。

但我關於陣列(巴)從Foo對象

bar擔心不爲 「從foo」。 bar是一個全局靜態對象。

f.bar[1] 

這是病態形成時,由於bar不是Foo成員。要聲明一個成員,它是類的定義中:

struct Foo { 
    int bar[10] = {}; 
}; 

時將它從棧中刪除?

如果bar有靜態存儲,比如在你的代碼中,那麼它會在程序結束時被銷燬。如果它是一個(非靜態)成員,那麼當它的完整對象被銷燬時它被銷燬,即包含它的Foo的實例。

+0

Thx很多!是不是我打算將其聲明爲靜態對象:D 但是根據你的說法,它仍然可以用作成員,並且由於整個對象超出了範圍,所以數組不會被刪除,所以一切都很好! – Asssasssiino

0

如果bar是您的Foo類,則bar -content一個foo -object將是foo -object的一部分的的非靜態數據成員;它將駐留在foo所在的位置(在堆棧上,在堆上),並且一旦foo被創建或銷燬,它將被創建和銷燬。

如果bar是一個靜態數據成員,那麼它將在您的完整程序中存在一次,並將「存活」直到程序結束。

0

這是否正確地返回foo對象doSmth()

是的,本地創建的對象必須由值返回。通常情況下,編譯器將創建對象並將副本進行優化。您可以在此處詳細瞭解本地返回的對象:https://isocpp.org/wiki/faq/ctors#return-local-var-by-value-optimization

我想創建堆棧的對象,但我很擔心barfoo對象,當將它從棧中刪除嗎?

如上所述,由於返回值優化,編譯器通常不會在doSmith的堆棧幀中創建此對象。此外,即使它是在doSmith的堆棧幀創建的,默認的拷貝構造函數和缺省賦值運算符的行爲是這樣的:

如果子對象是一個數組,每個元素分配,在適當的元素類型方式

見15.8.1 [class.copy.ctor] 14.1和15.8.2 [class.copy.assign] 12.2

+0

真的很好的解釋,將閱讀鏈接的維基文章! – Asssasssiino

+0

@Asssasssiino是的,這是C++常見問題解答,它涵蓋了它幾乎是關於如何在C++中完成任務的權威指南。 –

相關問題