C++ 是否有必要使用';新';以下C++;密码?

C++ 是否有必要使用';新';以下C++;密码?,c++,this-pointer,C++,This Pointer,代码是: class base{ base(){} virtual base* copy()const=0; virtual ~base(){} }; class derived:public base{ derived(){} base* copy()const; ~derived(){} }; base* derived::copy()const{ return new derived(*this); } 是否需要在函数copy()中使

代码是:

class base{
    base(){}
    virtual base* copy()const=0;
    virtual ~base(){}
};
class derived:public base{
    derived(){}
    base* copy()const;
    ~derived(){}
};
base* derived::copy()const{
   return new derived(*this);
}
是否需要在函数
copy()
中使用
new
运算符,或者为什么代码使用
new
运算符

我是否应该直接返回
这个
指针,如下所示:

const base* derived::copy()const{
   return this;// note: this pointer is const.
}

简单地说,不是

< > >代码> C++中的关键字是一个小的语法糖,意思是“指向这个对象的当前实例的指针”。 根据英语的定义,
copy
方法返回一个新对象,该对象在各个方面与第一个对象相同,但在内存中占据不同的位置。从
copy
方法返回
this
将很自然地与此范例相违背,因为它将返回指向“复制”对象的指针

base* derived::copy()const{
   return new derived(*this);
}

似乎是正确的-您必须在此处使用“new”运算符。否则,您将创建一个本地实例(派生类)并返回指向该本地实例的指针。执行方法后,本地实例将变得无效(因为它超出了范围)。

名为copy的方法并返回此方法?您是否曾经尝试过复制构造函数?不,您不应该返回此
。函数名意味着它是一个与原始对象相同但独立的新对象。人们不知道,当原始
this
被删除时,它可能是堆栈对象。@MarianSpanik:复制构造函数不是虚拟的,因此不能用于从
指针复制
派生的
对象,这是一个非常普遍的问题。该方法更经常被称为“代码>克隆< /COD>,而不是<代码>拷贝<代码>。非常好的措辞。”塞巴斯蒂安:我可以考虑返回一个新对象,可能是因为用户的习惯,对吗?