[英]Initialization after deletion of constructor
我的問題是:在刪除構造函數之后是否有任何方法來初始化類? 例如
class A{
public:
A() = delete;
int a = 42;
int fun(){
a += 1;
return a;
}
};
現在不應該使用這個類。 例如,你不能:
A* instance = (A*)malloc(sizeof(A));
instance->fun(); //segfault
和
A instance; //compile error undefined function
假設由於一些奇怪的原因你實際上想要使用刪除了構造函數的類,有沒有辦法可以做到? 這沒有像重寫構造函數那樣做。
我知道這是一個奇怪的問題,但我有興趣知道某人是否有(也許是模糊的)這樣做的方式。 謝謝!
如果類是聚合 ,則可以使用聚合初始化創建一個聚合初始化,而不會調用A
的構造函數。 例如:
A a = { 1 };
在C ++ 11中,由於存在= 42
,因此您的類不是聚合。 所以在C ++ 11中你的類是無法使用的。
但是在C ++ 14中,這個被改變了,並且= 42
不會阻止該類成為聚合,因此它可以再次使用。
允許這樣做的原因是調用malloc
並不等同於調用new
。 malloc
只是分配內存並返回它開始的地方; new
分配並構造一個對象。 只需直接創建A
,就像在A instance;
,運行構造函數 - 所以它期望它在那里。
因此,它不是錯誤,因為您從未實際構造任何A
對象。 您分配未初始化的內存,將指針強制轉換為A*
,然后調用它。 這是有效的,因為語言和編譯器不關心(或可能知道)你獲得內存的位置。 它只知道在運行時, instance
包含有效的已分配內存; 如果不是這種情況, 可能會出現段錯誤(也可能不是,但可能仍然不好)。
當你實際運行它時會發生什么, fun()
將訪問未初始化的內存,就好像它是A
; 因此, int a
將是某種東西,但可能不是42。
指針不需要指向可構造的類。 例如,您可以將實際的類指針強制轉換為其不可構造的接口類之一,並仍然可以訪問它。 實際上,允許的相同方法允許這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.