Person {
string name;int age;
Person(string name,int age);
}
我知道如果name是char *,我首先删除以前版本的name,将其设为NULL并分配一个新的char数组。 现在我有一根绳子,所以我要做什么?我想写这样的东西:
Person(const Person& copy){
this->name=copy.name;
this->age=copy.age; }
但它不起作用。我试图删除字符串名称,但编译器给我一个错误。 问题出在哪儿?谢谢!
答案 0 :(得分:1)
此:
Person(const Person& copy){
是一个复制构造函数,如果你想让赋值运算符使用;
Person& operator=(const Person& rop) {
name=rop.name;
age=rop.age;
return *this;
}
但编译器合成了一个复制赋值运算符,如果该类没有定义一个 - 同样适用于复制构造函数。所以我不清楚你的问题在哪里。
你是对的,如果你有char*
从动态分配中分配缓冲区,那么你必须自己管理它的生命周期(或使用智能指针)。但是对于std :: string或任何其他使用RAII惯用语的类,你使用所谓的rule of zero,所以不必担心编写代码来制作副本。
答案 1 :(得分:1)
这不是赋值运算符。相反,它是一个复制构造函数。 您可以像这样定义复制赋值运算符:
Person& operator = (const Person& other)
{
name= other.name;
age= other.age;
return *this;
}
答案 2 :(得分:0)
我知道如果name是char *,我首先要删除以前版本的name,将其设为NULL并分配一个新的char数组
假设类“拥有”指向的数组,那是正确的。
现在我有一根绳子,所以我要做什么?
在复制赋值运算符中,您需要复制分配成员字符串,就像使用int一样。
这正是隐式编译器生成的复制赋值运算符所做的,因此您根本不需要自己声明一个。
我想写下这样的东西:
Person(const Person& copy)
这是一个复制构造函数。您也不需要声明它,因为隐式生成的那个完全符合您的要求。
但是编译器给了我一个错误。问题在哪里?
问题出在错误信息指示的位置。
TL; DR您不需要添加自定义副本分配,也不需要复制构造函数。