c++ 嵌套new操作构造对像的执行顺序
突然比较好奇如果在某中class对象在拷贝构造时的函数调用顺序,下面用代码说清楚我的问题:
定义class object,
new object(*new object);虽然只有一行代码,但还是值得研究的。我们知道在类对象构造时,如果是new operator操作,其执行过程可以参考文章:new/delete operator和operator new/delete ,它说明了new操作其实是执行了两个步骤,其一是调用operator new,即申请一定大小的内存;其二是调用类的构造函数,在步骤一分配好的内存上调用产生类对象。那么双层new操作,其执行的步骤到底是怎么样的呢?
其结果不外乎两种:
1.申请内存优先:
1)为括号里的对象调用operator new;
2)为括号外的对象调用operator new;
3)为括号里的对象调用constructor;
4)为括号外的对象调用constructor。
2.对象构造完整性优先:
1)为括号里的对象调用operator new;
2)为括号里的对象调用constructor;
3)为括号外的对象调用operator new;
4)为括号外的对象调用constructor。
在scott meyers看来,申请内存优先中是先调用operator new获得内存空间,将内存空间设定位值,即将构造对象存在于heap中。而经过步骤3之后会导致步骤2的设定位值效果被清除,最后步骤4构造的对象会认为它不处于heap之中,但实际上确实是处于heap中。这部分的具体解释见《more effective c++》的条款27,即P150。
虽然条款27极力解释清楚,但我还是有些不明白。你有更好的解释,可以知会我一下,不甚感谢!