我的问题受到Thomas Cormen教授在Quora answer $ 上的第二条评论的影响。
他说构造函数执行以下三个任务:
为对象分配内存。
初始化对象的实例变量,例如,通过在Python中隐式调用 init 。 (我还强调 init 方法应该初始化不是一些,而是所有实例变量。)
- 醇>
返回对象的引用(即地址)。
然而,C ++ * 的MSDN documentation表示执行该操作的是new
运算符:
从free store为type-name的对象或对象数组分配内存,并返回一个指向该对象的适当类型的非零指针。
我的问题是,谁是对的?或者,还有更多内容,也许就像new
运算符总是调用构造函数一样,就像对帖子的评论所建议的那样?
感谢。
$不幸的是,Quora没有复制评论链接的选项 - 我只能这样做才能得到答案。
*虽然我说C ++,但我认为对于Java和C#等其他语言也是如此(尽管我不是100%肯定)。
答案 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;
}