考虑一下belo代码片段:
class Base
{
public:
Base()
{
cout<<"Constructor"<<endl;
}
Base(const Base& rhs)
{
cout<<"Copy constructor"<<endl;
}
Base* Clone()
{
return new Base(*this); <--------------- 2
}
void* operator new(size_t size)
{
void* p=malloc(size);
cout<<"Inside new"<<endl;
return p;
}
};
int main()
{
Base b1; <------------ 1
Base* ptr=b1.Clone();
return 0;
}
我得到的是output:
Constructor
Inside new
Copy constructor
我一直听说第一个运算符new分配了一大块void类型&amp;然后new运算符调用构造函数将该块转换为与LHS上的类型完全相同的类型 那么,为什么没有为语句2调用构造函数?
我还想知道C ++编译器对语句2采取的一系列精确行动。
答案 0 :(得分:7)
那么,为什么没有为语句2调用构造函数?
是的。你认为"Copy constructor"
来自哪里?
Base b1;
输出:Constructor
Base* ptr=b1.Clone();
来电
new Base(*this);
反过来调用你的operator new
然后调用你的复制构造函数。
答案 1 :(得分:0)
T * p = new T(a, b, c); delete p;
的实施在道德上等同于这个序列:
void * const addr = operator new(sizeof T); // either global or in T
T * p = new (addr) T(a, b, c); // ditto
p->~T();
operator delete(addr); // ditto
结果是内存分配和对象构造是C ++中两个截然不同的概念。