今天遇到乙個很有意思的面試題:
面試官:「怎麼讓類只能在堆上生成例項?」
我:「把析構函式設為私有」
原因如下:
編譯器在為類物件分配棧空間時,會先檢查類的析構函式的訪問性,其實不光是析構函式,只要是非靜態的函式,編譯器都會進行檢查。如果類的析構函式是私有的,則編譯器不會在棧空間上為類物件分配記憶體。當然,之後必須提供乙個public的函式刪除物件。
class
test
public
:void
destroy()
};intmain()
當然啦,如果需要只在棧上建立只需要過載new即可
class
test
void
operator
delete
(void
* ptr)
public:~
test()
};intmain()
可是我這個回答面試官貌似並不滿意的樣子???也不給我學(fan)習(wen)的機會,sad。
2020.10.8 更新:
破案了。一旦將建構函式設為私有儘管只能在堆上生成,但是忽略了繼承的問題。這時候應該當想到protected,即類外無法訪問但子類可以訪問。
只能在堆上生成的物件 VS 只能在棧上生成的物件
1.只能在堆上 即禁止在棧上生成。如何實現?當物件建立在棧上面時,是由編譯器分配記憶體空間的,呼叫建構函式來構造棧物件。如果類的析構函式是私有的,則編譯器不會在棧空間上為類物件分配記憶體。所以,只需把類的析構函式宣告為private即可禁止該類在棧上生成物件。但是別忘了提供乙個public的函式用於...
保證只能在堆上new乙個類物件
有的時候為了保證乙個類的物件必須在堆上被建立,比如當我們需要手動控制乙個物件的生命週期的時候,這個時候就必須保證這個物件是在堆上建立的,如何保證呢,有個小的技巧 就是將析構函式給private了.並且用另外個公共函式來呼叫析夠函式.class a private a int main 原因是c 是乙...
設計乙個類,只能在堆上建立物件
設計乙個類 只能在堆上建立物件 思路 說明不能在棧上建立物件,考慮到棧上建立物件會發生哪些事 1 建構函式 2 拷貝構造 所以先遮蔽掉建構函式,即設為私有。存在問題 在堆上建立物件也會呼叫建構函式,設為私有對其有影響 解決 提供成員函式介面,在成員函式中建立堆物件。存在問題 成員函式需要物件來呼叫,...