詳解如何定義乙個只能在堆上 棧上生成的類

2021-08-05 23:05:49 字數 1337 閱讀 9956

相信有很多同學和我一樣都遇到過這個問題,而且都無處下手,在網上搜答案可能也看不太明白,今天重新回顧了一下這個知識點,感覺掌握起來其實不難,相信你看完這篇部落格

就能明白

1.如何定義乙個只能在堆上生成的類

方法一:首先我們要在堆上定義乙個物件的時候一定要用new ,比如a *a=new a;

c++會先在堆上malloc一塊記憶體,然後執行建構函式。

相信有些人看到這個題都會這樣想:

class a

};

看到這裡不要笑,因為我一開始有這樣想過,為什麼不行呢?原因是無限遞迴呼叫建構函式,好闊怕

想到這裡既然不能再建構函式裡呼叫new來構造,那就重新定義乙個函式creat()來new,然後在類外呼叫creat()完成構造。想到這裡,感覺不錯。

還沒完人家要求只能在堆上生成物件,那麼也就是說你要生成乙個物件只能呼叫

creat(),不能使用建構函式。所以我們只能把建構函式定義為私有。

如果你以為這樣就完了,那你還是和我一樣年輕。這樣做是會報錯滴!我直接貼上正確的**

class c

private:

c(int c)

~c()

{} int _c;

};int main()

至此第一種方法我已經說清楚了。

方法二:這裡涉及到乙個知識點:編譯器在為類物件分配棧空間時,會先檢查類的析構函式的訪問性,其實不光是析構函式,只要是非靜態的函式,編譯器都會進行檢查。如果類的析構函式是私有的,則編譯器不會在棧空間上為類物件分配記憶體。

所以便有了下面的**:

class  a  

void  destory()  

private :  

~a(){}  

};

怎麼樣不難理解吧。

2.如何定義乙個只能在棧上生成的類

我們的思路還是和上面差不多,將建構函式設為私有的,然後重新定義乙個公有函式呼叫建構函式。如果你試圖在堆上建立乙個物件,這樣寫d* d=new d;那就執行不過去,因為建構函式宣告為私有,你無法訪問到。

class d

private:

d(int d)

int _d;

};int main()

老鐵們兒,雙擊666啊!

如何定乙個只能在堆上或者只能在棧上定義的類

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

如何定義乙個只能在堆上(棧上)生成物件的類

1 只能在堆上生成物件 將析構函式設定為私有。原因 c 是靜態繫結語言,編譯器管理棧上物件的生命週期,編譯器在為類物件分配棧空間時,會先檢查類的析構函式的訪問性。若析構函式不可訪問,則不能在棧上建立物件。2 只能在棧上生成物件 將new 和 delete 過載為私有。將new操作設定為私有,那麼第一...

如何定義乙個只能在堆上(棧上)生成物件的類

在c 中,類的物件建立分為兩種 靜態建立乙個類物件,是由編譯器為物件在棧空間分配記憶體,通過直接移動棧頂指標,挪出適當的空間,然後在這片記憶體空間上呼叫建構函式形成乙個棧物件。使用這種方法,直接呼叫類的建構函式。動態建立類物件,是使用new 運算子將物件建立在堆空間中。這個過程分為兩步 如何限制類物...