2012-06-28 63 views
0

我有這樣簡單的代碼:指針和參考棘手的代碼

int a = 1, b = 2; 
int* c[] = {&a,&b}; 
int& d[] = {a,b}; 
int x = *c[0]+d[1]; 

如果下面的作品

int &d = a; 

我無法理解爲什麼線3和4產生一個錯誤。 :-s

這真的是沒有意義的我:(

+1

如果你要問兩個問題,然後隨時免費二級菌種2個不同的線程。它在SO中是免費的。只是交叉檢查它是否被詢問過。 – iammilind

+0

@iammilind:我繼續前進,並刪除第二個問題和引用「繼承」。無論如何,我都很喜歡它,因爲它會不時出現。 –

+0

@MatthieuM .:現在我的答案的第二部分沒有意義。 :( –

回答

4
int& d[] = {a,b}; 

不能創建引用數組它不是由C++ Standard.For它允許讓整個類型的機制會。已被重新寫入。

int x = *c[0]+d[1]; 

給你一個錯誤,因爲編譯器不能做出來的類型d,因爲有你在哪裏申報d前行編譯錯誤。


B b[2]; 

創建B類型的兩個對象調用因此兩次B()

b[1]=D(); 

創建D類型的對象。爲此它調用類本身和其基類的構造函數,從而導致調用B()D()。創建的對象存儲在數組索引1。然而,由於陣列類型爲BObject Slicing發生並且對象的所有派生成員被切掉。從本質上講,在b[1]對象現在是該類型的B

b[1].print(); 

呼叫print()方法對象類型B以上爲什麼它是類型見說明B

1

問題#1

int& d[] = {a,b}; 

您不能創建一個引用數組。數組包含對象。實例,基元和指針是對象。參考不是。

問題#2,由於問題的改變,回答消失。

2

第一部分參見Als的回答。第二部分:

  • 前兩個構造函數用於數組的2個元素。
  • 第三乙構造是d
  • 則d構造
  • 然後d被破壞的基礎上,與B一起,因爲它是一個臨時對象
  • 則B的打印方法被調用,因爲它不是虛擬
  • ,然後從陣列的兩個B元素被破壞