2011-11-24 152 views
5

說我有一類FooC++取消引用指針之間

class Foo { 
} 

我做如下分配:

Foo *ptrFoo=new Foo(); 

Foo &ref=*(ptrFoo); //question 1 
Foo afoo=*(ptrFoo); //quesion 2 

我的問題:

1)當assignming爲 「& REF」內存在內存中發生了什麼? 它只是將「ptrFoo」的內存地址分配給「ref」?

2)當分配給「afoo」時,發生了什麼?它是否調用複製構造函數?這意味着內存分配給兩個Foo對象?即「afoo」和先前爲「ptrFoo」分配的內存?

3)說我有一個所謂的 「空隙methodBar(常量富&實例)」 方法 如果我通過 「ptrFoo」 爲:

methodBar((* preFoo));

這裏「const」的意義是什麼?

回答

8

1)當分配給「& ref」時,內存在內存中發生了什麼?只是將「ptrFoo」的內存地址分配給「ref」?

這取決於您的平臺,編譯器和編譯器設置。您的編譯器可能會爲解引用生成同義詞。由於引用可能不會被重新定義,因此編譯器確實不需要爲變量分配任何內存。

2)當分配給「afoo」時,發生了什麼?它是否調用複製構造函數?這意味着內存分配給兩個Foo對象?即「afoo」和先前爲「ptrFoo」分配的內存?

是,存儲在動態存儲的Foo的內容被複制(使用拷貝構造)至Foo中自動存儲的實例。儘管這裏沒有動態分配。如果沒有賦值,那麼將會創建aFoo實例。例如,Foo aFoo;

3)說我有一個所謂的 「空隙methodBar(常量富&實例)」 如果我通過 「ptrFoo」 爲: methodBar((* preFoo)方法); 這裏最重要的「const」是什麼?

const在該位置意味着,當該項目被通過引用傳遞,其宣稱參考const該方法不允許修改實例的參考引用。

4
  1. 在做Foo& ref = *ptrFoo;,你是一個參考*ptrFoo。目前只有一個Foo。您對ref*ptrFoo所做的任何更改都會影響同一個對象。

  2. 當你Foo afoo = *ptrFoo;(這是一樣的Foo afoo = ref;),創建另一個單獨Foo,它存在的*ptrFoo獨立。它由Foo的拷貝構造函數初始化。請注意,afoo存在於堆棧上,但在免費存儲區(堆)上存在*ptrFoo。您對*ptrFoo所做的任何更改都不會影響afoo反之亦然。還要注意的是afoo將被銷燬,當它超出範圍內存自動釋放,但*ptrFoo必須被銷燬,它的內存做delete ptrFoo;

  3. const在這種情況下顯式地釋放意味着該函數接受一個參考它承諾不會修改的Foo。它不能調用Foo上未標記爲const的任何方法。另外,當您調用此函數時,不會創建新的Foo(即,它不會按值傳遞)。

2

1)它創建對ptrFoo指向的對象的引用,不創建新對象。

2)複製構造函數被調用,它正在創建一個Foo類型的新對象。

3)const意味着你正在傳遞一個對其數據不應該被修改的對象的引用。

2

1)它分配由*(ptrFoo)返回的對象的內存地址,相當於ptrFoo

2)調用複製構造函數。您現在有兩個對象,一個分配在堆上,由ptrFoo指向另一個,分配給堆棧,名爲afoo

3)const意味着方法methodBar不能修改名爲instanceFoo&引用的對象。只允許撥打Foo上也標記爲const的方法。