使用std :: string定义operator =

时间:2016-04-21 14:39:09

标签: c++ operators assignment-operator

早上好!我正在尝试为这样的类定义赋值运算符:

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; }

但它不起作用。我试图删除字符串名称,但编译器给我一个错误。 问题出在哪儿?谢谢!

3 个答案:

答案 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您不需要添加自定义副本分配,也不需要复制构造函数。