"new"运算符是否总是调用构造函数?

Does the `new` operator always call the constructor?

本文关键字:quot 调用 构造函数 是否 new 运算符      更新时间:2023-10-16

我的问题受到Thomas Cormen教授对他的Quora回答$第二条评论的影响。

他说构造函数执行以下三个任务:

  1. 为对象分配内存。

  2. 初始化对象的实例变量,例如,通过在 Python 中隐式调用init。(我还强调,init方法应该初始化的不是一些,而是所有实例变量。

  3. 返回对对象的引用(即对象的地址)。

但是,C++*的 MSDN 文档指出,执行此操作的是new运算符:

从免费存储区为对象或类型为对象的数组分配内存,并返回指向该对象的适当类型的非零指针。

我的问题是,谁是对的? 或者,它是否还有更多的东西,也许就像new运算符总是调用构造函数一样,正如帖子上的评论所建议的那样?

谢谢。

$ 不幸的是,Quora 无法选择复制链接以获取评论 - 我只能这样做以获得答案。
* 虽然我说C++,但我认为对于 Java 和 C# 等其他语言也是如此(虽然我不是 100% 确定)。

如果您在链接的 MSDN 页面上搜索constructor,它会说:

当使用new为 C++ 类对象分配内存时,将在分配内存后调用对象的构造函数。

换句话说,如果构造函数存在,则调用构造函数。如果不存在,则调用 non。

如有疑问,请阅读规范。从 en.cppreference.com

新表达式尝试分配存储,然后尝试 构造和初始化单个未命名对象或未命名对象 分配的存储中的对象数组。新表达式返回 指向构造对象的 prvalue 指针,或者,如果是对象数组 是构造的,指向数组初始元素的指针。

构造函数不分配内存。 new 分配内存,然后调用正确的构造函数。

这里的半伪代码:

template <typename T>
T* new(Args... arguments_to_constructor_of_T_if_any)
{
void* mem = malloc(sizeof(T)); // Allocate memory 
// Call constructor 
// Compiler will produce machine code to construct object T over memory mem.
(mem) T(arguments_to_constructor_of_T_if_any); 
return (T*)(mem);
}

一个例子:

class A
{
int a;
int b;
A(int a, int b) { this->a = a; this->b = b; };
}
int main() 
{
A* a = new A(3, 4);
// After compiled, code above will look like : 
void* mem = malloc(sizeof(A));
// Below is A(int, int) constructor
((T*) mem)-> a = 3;
((T*) mem)-> b = 4;
}