在C++中,我們可以調用類的方法而不實例化它。如;沒有實例化使用類的方法的優點/缺點
MyClass mc;
mc.method();
有什麼優勢&使用類的方法沒有實例它的缺點是什麼?我們應該何時使用這種類型?
在C++中,我們可以調用類的方法而不實例化它。如;沒有實例化使用類的方法的優點/缺點
MyClass mc;
mc.method();
有什麼優勢&使用類的方法沒有實例它的缺點是什麼?我們應該何時使用這種類型?
僅僅因爲你沒有明確地調用構造函數,並不意味着你沒有實例化它。您使用的表單調用默認的構造函數。這可能會也可能不會正確設置類,但是這是類的作者需要解決的問題,而不是使用它的代碼。
編輯:它發生,我認爲我給可能混淆超過它幫助的建議,所以我將提供一些例子:
下面的類具有平凡缺省構造函數不初始化其成員:
class Point {
int x, y;
Point() { }
Point(int x, int y) : x(x), y(y) { }
};
你可以使用這個類或不明確的構造函數:
Point p;
Point r(2, 3);
在上述兩種形式中,類都被實例化並且實例可以使用,而不會導致任何崩潰或調用未定義的行爲。然而,在p
的情況下,成員變量x
和y
尚未被初始化,並且因此將具有對於所有意圖和目的都是隨機的值。通常情況下,你會通過顯式設置它的成員變量填充這樣的對象...
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_
設置爲空指針以獲得較好的度量)。
所有這一切的關鍵信息是對象可能被初始化,也可能不被初始化,但它實例化了是。
非常感謝 – meandbobbymcgee 2011-12-18 09:31:49
你很容易混淆實例化是否在堆棧上(在你的例子中)或在堆上(新的)創建它。拋開對象生命週期(和內存管理),在調用一個方法和另一個方法時沒有真正的區別。這更多的是關於物體的大小以及你需要多長時間。
但是你已經實例化它! – sharjeel 2011-12-17 22:13:39
就目前而言,這個問題沒有意義,因爲 - 正如@sharjeel所說 - 你已經實例化了這個類。投票結束爲NARQ。 (隨時修復它時重新打開標誌。) – sbi 2011-12-17 22:15:39
從'[instantiation]'標籤wiki:「Instantiation是在所有面向對象和基於對象的語言中從類創建對象的過程。」 – Xeo 2011-12-17 22:17:00