2011-12-17 68 views
0

在C++中,我們可以調用類的方法而不實例化它。如;沒有實例化使用類的方法的優點/缺點

MyClass mc; 
mc.method(); 

有什麼優勢&使用類的方法沒有實例它的缺點是什麼?我們應該何時使用這種類型?

+18

但是你已經實例化它! – sharjeel 2011-12-17 22:13:39

+0

就目前而言,這個問題沒有意義,因爲 - 正如@sharjeel所說 - 你已經實例化了這個類。投票結束爲NARQ。 (隨時修復它時重新打開標誌。) – sbi 2011-12-17 22:15:39

+0

從'[instantiation]'標籤wiki:「Instantiation是在所有面向對象和基於對象的語言中從類創建對象的過程。」 – Xeo 2011-12-17 22:17:00

回答

4

僅僅因爲你沒有明確地調用構造函數,並不意味着你沒有實例化它。您使用的表單調用默認的構造函數。這可能會也可能不會正確設置類,但是這是類的作者需要解決的問題,而不是使用它的代碼。

編輯:它發生,我認爲我給可能混淆超過它幫助的建議,所以我將提供一些例子:

下面的類具有平凡缺省構造函數不初始化其成員:

class Point { 
    int x, y; 
    Point() { } 
    Point(int x, int y) : x(x), y(y) { } 
}; 

你可以使用這個類或不明確的構造函數:

Point p; 
Point r(2, 3); 

在上述兩種形式中,類都被實例化並且實例可以使用,而不會導致任何崩潰或調用未定義的行爲。然而,在p的情況下,成員變量xy尚未被初始化,並且因此將具有對於所有意圖和目的都是隨機的值。通常情況下,你會通過顯式設置它的成員變量填充這樣的對象...

Point a; 
a.x = f(); 
a.y = g(); 

...或傳遞對象到另一個函數來填充......

void f(Point& p) { p = something(); } 
⋮ 
Point b; 
h(b); 

在其他情況下,默認構造必須初始化對象以非平凡的方式:

template <typename T> 
class MyArray { 
public: 
    MyArray() : len_(0), capacity_(0), arr_(0) { } 
    void add(const T& t) { 
     if (len_ == capacity_) grow(); 
     arr_[len_++] = t; 
    } 
    ⋮ 
private: 
    size_t len_, capacity_; 
    T* arr_; 

    void grow() { … } 
}; 

構造的目的是生存儲器轉換成可用的對象。在Point的情況下,實例無需執行任何操作即可使用。在的情況下,len_capacity_必須在構建時設置爲零,以便像add()這樣的成員函數的行爲正確(我也將arr_設置爲空指針以獲得較好的度量)。

所有這一切的關鍵信息是對象可能被初始化,也可能不被初始化,但它實例化了

+0

非常感謝 – meandbobbymcgee 2011-12-18 09:31:49

2

你很容易混淆實例化是否在堆棧上(在你的例子中)或在堆上(新的)創建它。拋開對象生命週期(和內存管理),在調用一個方法和另一個方法時沒有真正的區別。這更多的是關於物體的大小以及你需要多長時間。