C 實現乙個只能在堆 棧 上生成物件的類

2021-09-29 08:14:52 字數 3453 閱讀 5944

目錄

只能在堆上生成物件的類

只能在棧上生成物件的類

在c++中,類的物件建立可以靜態建立在棧區, 如a a;還可以動態建立在堆區,如a* ptr=new a;這兩種方式是不同的, 具體來

靜態建立乙個類的物件,是由編譯器為物件在棧空間中分配記憶體,是通過直接移動棧頂指標,挪出適當的空間,然後在這片記憶體空間上呼叫建構函式形成乙個棧物件。使用這種方法,直接呼叫類的建構函式。

動態建立類物件,是使用new運算子將物件建立在堆空間中, 是程式設計師主動申請的堆空間. 這個過程分為兩步,第一步是執行operator new()函式,在堆空間中搜尋合適的記憶體並進行分配 ; 第二步是呼叫建構函式構造物件,初始化這片記憶體空間。這種方法,會間接呼叫類的建構函式。

總的思路就是使其不能在棧上建立, 在堆上可以

思路一: 建構函式私有化1. 不能讓這個類在棧上建立, 由於在棧上建立物件要直接呼叫建構函式, 如果我們把建構函式私有化, 就 無法在棧上建立物件了 

2. 那麼我們又如何在堆上建立物件呢, 由於建立物件必定要呼叫建構函式, 在我們不定義其他建構函式時, 我們已經將兩個預設建構函式已經私有, 在類外肯定是呼叫不到建構函式,  我們只有定義乙個公有的靜態成員函式 ,在其內部用new在堆區建立物件並返回其指標, (這裡有很難以理解的一點, 在靜態成員函式中用new 建立乙個物件時, 也會呼叫建構函式, 我們知道, 靜態成員函式不能呼叫成員函式, 那麼new是如何調到建構函式的呢? 這得從靜態成員函式為什麼不能訪問成員函式說起, 每乙個物件都有乙個隱含的this指標, 訪問成員函式實際上時通過this指標呼叫的, 而在構造函式呼叫前還沒有例項化出物件, 也就沒有this指標, 所以建構函式不需要this指標呼叫, 靜態成員函式也就可以呼叫建構函式了), 這點解釋通了

還值得注意的是,  還必須將拷貝構造私有化, 不然會出現 用堆上建立好的物件拷貝構造乙個棧上的物件這種情況發生

上**

class.h

#pragma onceclass t1t1(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 t2public: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 onceclass t3public: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 運算子將物件建立在堆空間中。這個過程分為兩步 如何限制類物...