2013-03-16 60 views
-6
class T{ 
public: 
    T(){} 
}; 

int main() 
{ 
    T *t = new T; //line 8 

} 

我的意思是在進入構造函數之前代碼的外觀如何?例如,在第8行的operator new返回地址,然後代碼看起來像T *t = T 0x0FF00,因爲它就像對象定義一樣,不能像0x0FF00 T那樣。所以如果這是真的,那麼這個由operator new返回的地址如何在類型T之後站立,這是否意味着operator new返回它之前的事實?當這個代碼「new T」中的operator new返回地址時會發生什麼?

+2

對不起,但我讀了你的帖子三次,我仍然不明白你在這裏問什麼。 – Philipp 2013-03-16 12:46:18

+1

你在這裏問的問題並不完全清楚。你能編輯你的問題來澄清你在說什麼嗎? – 2013-03-16 12:46:32

+1

你是什麼意思「代碼看起來像'T * t = T 0x0FF00'」? – Angew 2013-03-16 12:48:11

回答

3
T *t = new T; 
//  ^^^^^ 

這是T*類型的t的聲明。它正在被=之後的表達式初始化。整個new T部分是新表達式在此初始化器中。

新表達式導致將內存分配給類型爲T的對象,然後在該空間中構建該對象。 新表達式返回指向該對象的指針。也就是說,新的表達進行了評估之後,該行現在看起來像:

T *t = returned_pointer; 

我假設你正在使用0x0FF00作爲一個例子內存地址 - 在這種情況下,你能想象的線有成爲:

T *t = 0x0FF00; // Note: this wouldn't actually compile because 0x0FF00 is an integer literal 

指針t現在與內存地址初始化。

您可能會對新表達式做什麼感到困惑。它具有以下兩個步驟:

  1. 它調用適當的分配函數(通常爲operator new),傳遞它需要存儲T類型的對象的存儲器的大小。 operator new分配該內存並返回指向該位置的地址。

  2. 然後在該空間中初始化一個類型爲T的對象。

相關問題