簡體   English   中英

刪除構造函數后的初始化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM