代码之家  ›  专栏  ›  技术社区  ›  P.K.

“new”操作符是否总是调用构造函数?

  •  6
  • P.K.  · 技术社区  · 7 年前

    我的问题受到托马斯·科尔曼教授的影响 第二条评论 在他的 Quora answer $

    他说,建造师执行以下三项任务:

    1. 为对象分配内存。

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

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

    然而 MSDN documentation 对于C++ * 说这是 new 执行此操作的操作员:

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

    我的问题是,谁是对的?或者,是否还有其他原因,比如 操作员总是调用构造函数,正如帖子上的评论所建议的那样?

    谢谢

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

    3 回复  |  直到 4 年前
        1
  •  4
  •   Potatoswatter    7 年前

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

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

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

        2
  •  3
  •   Ripi2 user10587824    7 年前

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

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

        3
  •  1
  •   vkx    7 年前

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