删除构造函数后的初始化

Initialization after deletion of constructor

我的问题是:删除构造函数后,有没有办法初始化一个class?例如

class A{
    public:
        A() = delete;
        int a = 42;
        int fun(){
            a += 1; 
            return a;
        }
};

现在应该不能使用这个class。例如你不能:

A* instance = (A*)malloc(sizeof(A));
instance->fun(); //segfault

A instance; //compile error undefined function

假设出于某种奇怪的原因,您实际上想使用 class 并删除了构造函数,有什么办法可以做到吗?那是没有做类似重写构造函数的事情。

我知道这是一个奇怪的问题,但我很想知道是否有人有(可能晦涩难懂的)这样做的方法。谢谢!

如果 class 是一个 聚合 ,您可以使用聚合初始化创建一个聚合,它不会调用 A 的构造函数。例如:

A a = { 1 };

在 C++11 中,由于 = 42 的存在,您的 class 不是聚合。所以在 C++11 中你的 class 是不可用的。

但在 C++14 中,这发生了变化,= 42 不会阻止 class 成为聚合,因此它可以再次使用。

允许这样做的原因是调用 malloc 不等同于调用 newmalloc 只是分配内存和 returns 它开始的地方; new 分配并构造一个对象。直接创建一个 A,如 A instance;,运行 也是构造函数 - 所以它希望它在那里。

因此,这不是错误,因为您实际上从未构造任何A对象。您分配未初始化的内存,将指针转换为 A*,然后调用它。这是有效的,因为语言和编译器不关心(或可能知道)您从哪里获得该内存。它所知道的是,在 运行 时间,instance 包含有效分配的内存;如果不是这种情况,它 可能 段错误(也可能不会,但仍然可能很糟糕)。

当您实际 运行 时会发生什么,这是 fun() 将访问未初始化的内存,就好像它是 A;因此,int a 会是一些东西,但 可能 不是 42.

不需要指针指向可构造的 class。例如,您可以将实际的 class 指针转换为它的 non-constructable 接口 class 之一,并且仍然可以访问它。实际上,允许这样做的相同方法。