2015-11-02 82 views
3

我想知道一些關於C++中的對象初始化。如果可能,我應該避免使用'new'關鍵字,因爲我不需要它提供的內容(動態分配,對嗎?),我不想手動刪除對象。我有麻煩調用我的對象的初始化,但不使用新的。我有這個類:對象初始化沒有「新」C++

class Apodization { 

public: 
    Apodization() 
    { 
    std::cout << "Constructor for Apodization" << std::endl; 
    } 
} 

和驗證碼:

Apodization* apoObj(); 
// Apodization* apoObj = new Apodization(); 

使用時新創建的對象,但並非沒有打印發生如預期。我猜這是因爲我只是在上面的例子中創建了一個Apodization類型的指針,但我不知道該從哪裏去。我想知道不使用new關鍵字來初始化Apodization對象的正確方法。謝謝您的幫助!我發現來自Java和Python的C++類有點奇怪。

+5

除非你需要一個指針,你應該有對象:'變跡apoObj();' – NathanOliver

+0

如果你有一個指針,創建什麼,直到你調用'new'。如果你有一個堆棧分配的對象,你可以調用初始化器。 – tadman

+0

如果您想要動態分配並且不想手動刪除對象,請使用std :: unique_ptr。 – Max

回答

11

一個目的是不new使用RAII初始化(

+0

真棒謝謝你!很棒!我一定會檢查編程指南。我可以用它來傾斜C++ –

1

你不能。 new運算符爲對象分配內存,調用該對象的構造函數,然後返回指針。在你的代碼中,你所做的只是聲明指針,而不用爲它留出任何內存,或者構造函數正在做任何工作。這只是一個指向什麼都沒有的指針。如果你想使用一個指針來訪問它,然後指向靜態實例

static Apodization apoObj; // This will create an instance of the object. 

static Apodization SapoObj; // This will create an instance of the object. 
static Apodization* apoObj = &SapoObj; 
+3

更具體地說,它是一個*未初始化的指針*,指向某個東西,但沒有任何有效。 – tadman

+0

這個問題並不是真的關於新的,而是構造函數的調用。 – legalize

-1

只需創建一個靜態實例資源分配是初始化)。這意味着,當你變跡聲明的一個實例,內存爲實例在棧上分配,然後調用構造函數來設置初始狀態。

這意味着簡單地寫:

int main(){ 
    Apodization apodization; 
    //apodization.doSomething(); 
    return 0; 
} 

是所有你需要讓球滾動! (作爲一個Java人,我喜歡這個簡潔性!)

由於對象被分配到棧上,析構函數會自動在作用域的末尾被調用;無需手動內存管理。

P.S.我強烈建議你閱讀Bjarne Stroustrops C++ 11編程指南!

+0

我想你已經被低估了,因爲'Apodization apoObj();'在C++中是無效的,它必須是'Apodization apoObj;'。 – jpo38

+0

因爲'Apodization * apoObj =&SapoObj;'沒有真正的用處,並且如果您不知道'SapoObj'的作用域如果在作用域結束後使用它將如何影響指針'apoObj',會導致問題。 – crashmstr

+0

@ jpo38 - 謝謝 - 最近沒有做很多C++! –