"new"运算符是否总是调用构造函数?
Does the `new` operator always call the constructor?
我的问题受到Thomas Cormen教授对他的Quora回答$的第二条评论的影响。
他说构造函数执行以下三个任务:
为对象分配内存。
初始化对象的实例变量,例如,通过在 Python 中隐式调用init。(我还强调,init方法应该初始化的不是一些,而是所有实例变量。
返回对对象的引用(即对象的地址)。
但是,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;
}
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- std::cout.imbue()多重调用
- 函数何时会在c++中包含stack_Unwind_Resume调用