`new`运算符总是调用构造函数吗?

时间:2018-05-17 17:41:46

标签: c++ constructor new-operator

我的问题受到Thomas Cormen教授在Quora answer $ 上的第二条评论的影响。

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

  
      
  1. 为对象分配内存。

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

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

  6.   

然而,C ++ * MSDN documentation表示执行该操作的是new运算符:

  

从free store为type-name的对象或对象数组分配内存,并返回一个指向该对象的适当类型的非零指针。

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

感谢。

$不幸的是,Quora没有复制评论链接的选项 - 我只能这样做才能得到答案。
*虽然我说C ++,但我认为对于Java和C#等其他语言也是如此(尽管我不是100%肯定)。

3 个答案:

答案 0 :(得分:3)

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

  

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

答案 1 :(得分:1)

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

  

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

换句话说,如果存在一个构造函数,则调用它。如果不存在,则不调用任何一个。

答案 2 :(得分:0)

构造函数不分配内存。 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;
}