以下C++代码是否需要使用'new'运算符?

3
代码如下:
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 操作符?

我应该像这样直接返回 this 指针吗:

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

5
一种名为“复制并返回”的方法? - Remus Rusanu
4
你听说过拷贝构造函数吗? - Marian Spanik
2
不,你不应该返回 this。函数名称暗示它是一个新的对象,与原始对象相同但独立的。 - StoryTeller - Unslander Monica
1
当原始的 this 被删除时,可能是一个堆栈对象,这一点是不确定的。 - Joop Eggen
3
复制构造函数不是虚拟的,因此不能用于从基类指针复制派生类对象,这是一个非常常见的问题。该方法更常被称为clone而不是copy - galinette
显示剩余7条评论
2个回答

11

简单来说,不行。

C++中的this关键字是一个小小的语法糖,意思是"指向当前对象实例的指针"。

根据英语定义,copy方法应该返回一个全新的对象,与第一个对象在每个方面上都完全相同,但占用内存中不同的位置。从copy方法中返回this会违反这种范式,因为它将返回一个指向被"复制"的对象的指针。


非常好的措辞。 - barak manos
@Sebastian:我可以认为返回一个新对象只是因为用户的自定义,对吗? - Tong

-1

你的函数

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

看起来是正确的 - 这里必须使用 "new" 操作符。否则,您将创建一个局部实例(派生类)并返回一个指向该局部实例的指针。在执行您的方法后,局部实例将变得无效(因为它超出了范围)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接