用 std::string 定义运算符 =

Define operator = with std::string

早上好!我正在尝试为 class 定义赋值运算符,如下所示:

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

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

这个:

Person(const Person& copy){

是拷贝构造函数,如果要赋值运算符就用;

Person& operator=(const Person& rop) {
   name=rop.name;
   age=rop.age;
   return *this;
}

但是如果 class 没有定义复制赋值运算符,编译器会合成一个复制赋值运算符 - 这同样适用于复制构造函数。所以我不清楚你的问题出在哪里。

你是对的,如果你有一个 char* 从动态分配中分配的缓冲区,那么你必须自己管理它的生命周期(或使用智能指针)。但是使用 std::string 或任何其他使用 RAII idiom, you use the so called rule of zero 的 class,因此无需担心编写代码来制作副本。

那不是赋值运算符。相反,它是一个复制构造函数。 您可以这样定义复制赋值运算符:

Person& operator = (const Person& other)
{
    name= other.name;
    age=  other.age;
    return *this;
}

I know that if name would be a char*, I've first to delete the previous version of name, make it NULL and allocate a new array of char

假设class "owns"指向数组,那是正确的。

Now I've a string, so what I've to do?

在复制赋值运算符中,您需要像对 int 一样复制赋值成员字符串。

这正是编译器生成的隐式复制赋值运算符所做的,因此您根本不需要自己声明一个。

I thought to write something like this:

Person(const Person& copy)

那是一个拷贝构造函数。您也不需要声明,因为隐式生成的完全符合您的要求。

but the compiler gives me an error. Where is the problem?

问题将出现在错误消息指示的位置。


TL;DR 您根本不需要添加自定义复制赋值,也不需要复制构造函数。