c++基礎(建立/例項化物件)

Cplusplus-tutorial-in-hindi.jpg
建立一個物件,根據不同建立方式可以讓物件存在於棧或堆記憶體不同位置,不同型別記憶體表示物件的宣告週期的不同,在棧中物件會隨著作用域結束而消失,而位於堆記憶體的物件將永遠存活知道我們手動將其銷燬。
這裡定義一個類 Pointer 有兩個建構函式,分別為無引數和接收一個引數。
class Pointer { private: String m_Name; public: Pointer() : m_Name("Unknown") {} Pointer(const String &name) : m_Name(name) {} const String &GetName() const { return m_Name; } };
在棧記憶體建立方法
Pointer p;
也可以這樣來初始化一個帶有引數的 Pointer
的例項,同樣會在棧記憶體上建立物件。這樣物件的生命週期受制於作用域。
Pointer p = Pointer("point"); std::cout << p.GetName() << std::endl;
如果在函式 Func
中宣告一個位於棧記憶體物件,當 Func
作用域結束,物件也將被銷燬,其佔用記憶體會被自動釋放掉。
void Func() { Pointer p = Pointer("point"); std::cout << p.GetName() << std::endl; }
在堆上建立記憶體
Pointer *ptr; { Pointer p = Pointer("point"); ptr = &p; std::cout << p.GetName() << std::endl; }
有的時候我們棧記憶體大小是有限制,如果大型物件或則大的陣列我們需要將其儲存在堆記憶體而非棧記憶體。
- 將物件分配到堆記憶體所用時間要遠遠大於將物件分配到棧記憶體上。
Pointer *ptr; { Pointer *p = new Pointer("pointer"); ptr = p; std::cout << ptr->GetName() << std::endl; } delete ptr;
在堆上建立物件,需要我們通過 delete 手動將其銷燬。
當我們建立一個類的例項時候先問自己兩個問題然後再決定在對棧記憶體還是堆記憶體中建立物件。
- 物件是不是 giant 物件
- 是否需要我們自主控制物件的宣告zhouqi
如果答案都是不,我們就可以選擇在堆上建立物件,這樣更容易更快捷且便於管理。