运营商如何调用类的构造函数?

问题描述:

我知道,新的操作符会调用类的构造函数。运营商如何调用类的构造函数?

但是,它是如何发生的,什么是用于此的地平面技术。

+1

看到[这个答案](http://*.com/questions/2697892/what-is-return-type-of-new-in-c/2697929#2697929)到一个类似的问题。基本上,你需要明白有一个__new表达式___和一个__new操作符___,它们是相关的,但不相同。 _ new expression_首先调用_operator new_,然后调用_constructor_。 – sbi 2010-05-31 09:04:55

编译器为此生成机器码。当编译器看到

CSomeClass* object = new CSomeClass(); 

新语句)它生成的代码调用适当的operator new()(其中分配内存),调用合适的构造,在例外的情况下调用所有完全构造子对象的析构函数,调用operator delete()在施工期间发生异常的情况下。所有这些都是由C++编译器为简单查看语句生成的额外机器代码完成的。

这里是我想象:

T* the_new_operator(args) 
{ 
    void* memory = operator new(sizeof(T)); 
    T* object; 
    try 
    { 
     object = new(memory) T(args); // (*) 
    } 
    catch (...) 
    { 
     operator delete(memory); 
     throw; 
    } 
    return object; 
} 

(*)从技术上讲,它不是真正的呼唤投放新的,但只要你不超载的是,心理优良样板工程:)

+0

这是非常简化的,并没有反映出这样的事实,即当抛出异常时,所有*完全构造的子对象都在运行析构函数。虽然我无法想象你如何能够在预科码中说明这一点。 – sharptooth 2010-05-31 07:24:32

+3

@sharp但是这正是任何构造函数总是这样做的,无论内存来自哪里。新运营商不必专门做这件事。 – fredoverflow 2010-05-31 07:35:43

这不是真正的调用构造函数的新运算符。更是翻译以下行的编译器:

MyClass * mine = new MyClass(); 

为以下:

MyClass * mine = malloc(sizeof(MyClass)); // Allocates memory 
mine->MyClass();       // Calls constructor 

与其他错误处理,其他的答案已经注意到代码。

+3

不,不是'malloc()' - 'operator new()'就是所谓的。差别很大(例如,您可以为每个类重载'operator new()')。 – sharptooth 2010-05-31 07:37:46

+0

确实如此,但为了简单起见,我使用了'malloc()',并试图指出它只是分配一堆内存的问题。没有其他的。重载'operator new'是更高级的考虑因素,我不会将这个更低层次的问题作为当前的解释来使用。 – 2010-05-31 07:50:35

+1

不幸的是,'malloc'这个名称比'operator new'好很多,因为后者经常和新的操作符混淆...... :( – fredoverflow 2010-05-31 10:15:29