目錄
只能在堆上生成物件的類
只能在棧上生成物件的類
在c++中,類的物件建立可以靜態建立在棧區, 如a a;還可以動態建立在堆區,如a* ptr=new a;這兩種方式是不同的, 具體來靜態建立乙個類的物件,是由編譯器為物件在棧空間中分配記憶體,是通過直接移動棧頂指標,挪出適當的空間,然後在這片記憶體空間上呼叫建構函式形成乙個棧物件。使用這種方法,直接呼叫類的建構函式。
動態建立類物件,是使用new運算子將物件建立在堆空間中, 是程式設計師主動申請的堆空間. 這個過程分為兩步,第一步是執行operator new()函式,在堆空間中搜尋合適的記憶體並進行分配 ; 第二步是呼叫建構函式構造物件,初始化這片記憶體空間。這種方法,會間接呼叫類的建構函式。
總的思路就是使其不能在棧上建立, 在堆上可以
思路一: 建構函式私有化1. 不能讓這個類在棧上建立, 由於在棧上建立物件要直接呼叫建構函式, 如果我們把建構函式私有化, 就 無法在棧上建立物件了class.h2. 那麼我們又如何在堆上建立物件呢, 由於建立物件必定要呼叫建構函式, 在我們不定義其他建構函式時, 我們已經將兩個預設建構函式已經私有, 在類外肯定是呼叫不到建構函式, 我們只有定義乙個公有的靜態成員函式 ,在其內部用new在堆區建立物件並返回其指標, (這裡有很難以理解的一點, 在靜態成員函式中用new 建立乙個物件時, 也會呼叫建構函式, 我們知道, 靜態成員函式不能呼叫成員函式, 那麼new是如何調到建構函式的呢? 這得從靜態成員函式為什麼不能訪問成員函式說起, 每乙個物件都有乙個隱含的this指標, 訪問成員函式實際上時通過this指標呼叫的, 而在構造函式呼叫前還沒有例項化出物件, 也就沒有this指標, 所以建構函式不需要this指標呼叫, 靜態成員函式也就可以呼叫建構函式了), 這點解釋通了
還值得注意的是, 還必須將拷貝構造私有化, 不然會出現 用堆上建立好的物件拷貝構造乙個棧上的物件這種情況發生
上**
#pragma once
class t1
t1(t1& x):b(x.b)
public:
int b;
static t1* newt1_p(int val = 0)
static t1& newt1(int val = 0)
};
測試入口main.cpp
#include
#include"class.h"
int main()
執行結果 :
如果我們靜態建立在棧上的話編譯不過, 如下:
#include
#include"class.h"
using namespace std;
int main()
執行結果: 編譯未通過, 原因是建構函式私有化, 無法在類外訪問
思路二: 析構函式私有化將析構函式私有化, 在棧上也就不能直接建立物件了, 因為編譯器在編譯時會進行檢測, 那沒有析構函式也是不行的, 我們還需要實現乙個函式來呼叫私有的析構函式, (這個思路就比建構函式私有好理解多了)class.h上**
class t2
public:
int b;
t2(int val = 0) :b(val)
void destroy()
};
測試入口 main.cpp
#include
#include"class.h"
using namespace std;
int main()
嘗試在棧上建立
總體思路就是乙個普通的類, 不讓其在堆上建立物件, 在堆上建立物件必定要用到new ,那我們直接在這個類內部將new過載成乙個私有的成員函式, 目的就是讓在類外使用不到原來的操作符new, 這樣在類外就無法在堆上建立這個物件了class.h上**
#pragma once
class t3
public:
int a;
t3(int val = 0) :a(val)
};
測試入口main.cpp
嘗試用new在堆上建立
#include
#include"class.h"
using namespace std;
int main()
執行結果: 建立不成功
C 定義乙個只能在堆上(棧上)生成物件的類
如何定義乙個只能在堆上 棧上 生成物件的類?1 靜態建立 class a a a 靜態建立乙個類的物件,編譯器為該物件在棧中分配記憶體,通過直接移動棧頂指標,挪出適當空間 然後呼叫類的建構函式形成乙個棧上的物件。注意 直接呼叫類的建構函式。當銷毀物件時,呼叫類的析構函式。2 動態建立 動態建立類物件...
如何定義乙個只能在堆上(棧上)生成物件的類
1 只能在堆上生成物件 將析構函式設定為私有。原因 c 是靜態繫結語言,編譯器管理棧上物件的生命週期,編譯器在為類物件分配棧空間時,會先檢查類的析構函式的訪問性。若析構函式不可訪問,則不能在棧上建立物件。2 只能在棧上生成物件 將new 和 delete 過載為私有。將new操作設定為私有,那麼第一...
如何定義乙個只能在堆上(棧上)生成物件的類
在c 中,類的物件建立分為兩種 靜態建立乙個類物件,是由編譯器為物件在棧空間分配記憶體,通過直接移動棧頂指標,挪出適當的空間,然後在這片記憶體空間上呼叫建構函式形成乙個棧物件。使用這種方法,直接呼叫類的建構函式。動態建立類物件,是使用new 運算子將物件建立在堆空間中。這個過程分為兩步 如何限制類物...