请看下面的代码,告诉我以后会不会出现问题,如果会,如何避免。
class Note
{
int id;
std::string text;
public:
// ... some ctors here...
Note(const Note& other) : id(other.id), text(other.text) {}
void operator=(const Note& other) // returns void: no chaining wanted
{
if (&other == this) return;
text = other.text;
// NB: id stays the same!
}
...
};
简而言之,我希望复制构造函数创建对象的精确副本,包括其(数据库)ID 字段。另一方面,当我分配时,我只想复制数据字段。但我有一些担忧,因为通常复制 ctor 和 operator= 具有相同的语义。
id 字段仅供 Note 及其朋友使用。对于所有其他客户端,赋值运算符确实创建了一个精确的副本。用例:当我想编辑笔记时,我使用 copy ctor 创建一个副本,对其进行编辑,然后在管理笔记的 Notebook 类上调用 save:
Note n(notebook.getNote(id));
n = editNote(n); // pass by const ref (for the case edit is canceled)
notebook.saveNote(n);
另一方面,当我想创建一个与现有笔记具有相同内容的全新笔记时,我可以这样做:
Note n;
n = notebook.getNote(id);
n.setText("This is a copy");
notebook.addNote(n);
这种方法合理吗?如果不是,请指出可能的负面后果是什么!非常感谢!