删除构造函数后的初始化
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
不等同于调用 new
。 malloc
只是分配内存和 returns 它开始的地方; new
分配并构造一个对象。直接创建一个 A
,如 A instance;
,运行 也是构造函数 - 所以它希望它在那里。
因此,这不是错误,因为您实际上从未构造任何A
对象。您分配未初始化的内存,将指针转换为 A*
,然后调用它。这是有效的,因为语言和编译器不关心(或可能知道)您从哪里获得该内存。它所知道的是,在 运行 时间,instance
包含有效分配的内存;如果不是这种情况,它 可能 段错误(也可能不会,但仍然可能很糟糕)。
当您实际 运行 时会发生什么,这是 fun()
将访问未初始化的内存,就好像它是 A
;因此,int a
会是一些东西,但 可能 不是 42.
不需要指针指向可构造的 class。例如,您可以将实际的 class 指针转换为它的 non-constructable 接口 class 之一,并且仍然可以访问它。实际上,允许这样做的相同方法。
我的问题是:删除构造函数后,有没有办法初始化一个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
不等同于调用 new
。 malloc
只是分配内存和 returns 它开始的地方; new
分配并构造一个对象。直接创建一个 A
,如 A instance;
,运行 也是构造函数 - 所以它希望它在那里。
因此,这不是错误,因为您实际上从未构造任何A
对象。您分配未初始化的内存,将指针转换为 A*
,然后调用它。这是有效的,因为语言和编译器不关心(或可能知道)您从哪里获得该内存。它所知道的是,在 运行 时间,instance
包含有效分配的内存;如果不是这种情况,它 可能 段错误(也可能不会,但仍然可能很糟糕)。
当您实际 运行 时会发生什么,这是 fun()
将访问未初始化的内存,就好像它是 A
;因此,int a
会是一些东西,但 可能 不是 42.
不需要指针指向可构造的 class。例如,您可以将实际的 class 指针转换为它的 non-constructable 接口 class 之一,并且仍然可以访问它。实际上,允许这样做的相同方法。