用 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 您根本不需要添加自定义复制赋值,也不需要复制构造函数。
早上好!我正在尝试为 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 您根本不需要添加自定义复制赋值,也不需要复制构造函数。