请考虑以下示例:
void * operator new(size_t size)
{
void * p = malloc(size);
//Error handling supressed...
return p;
}
void operator delete(void * p)
{
free(p);
}
class foo
{
public:
foo() { baz = 4234; }
int baz;
};
class bar
{
public:
bar() { np = new foo(); }
~bar() { delete np; }
foo* np = nullptr;
};
int main(int argc, char* argv[])
{
bar * a = new bar();
printf("%d\n", (*a).np->baz);
delete a;
return 0;
}
我不明白为什么这样做。在这种情况下如何调用构造函数?都不是类ID POD(普通旧数据),它们都有构造函数和析构函数! static_assert
授予我foo
或bar
不是POD,所以...
为什么printf
在控制台上输出值4234
?怎么了?这不应该给我带来意想不到的东西吗?我正在使用Visual Studio 15编译器。
答案 0 :(得分:1)
根据[class.ctor]/8,调用默认构造函数以创建由new表达式创建的动态存储持续时间的类对象,其中new初始化器被省略(无论是否为默认{{1} }或用户定义的operator new
)。
如果您不为类提供任何构造函数,则编译器将始终将默认构造函数声明为内联公共成员。 并且,如果未将隐式声明的默认构造函数定义为已删除,则将定义i t 。
因此,在这种情况下,将为operator new
和foo
调用默认的构造函数。