C ++复制/移动构造函数和赋值运算符

巴赫拉姆敦·阿迪尔(Bahramdun Adil)

我想了解C ++复制/移动构造函数和赋值运算符,让我们首先给出代码示例:

标头:

class Person
{
public:
    Person();
    Person(const char * name, int age);
    Person(const Person &person);
    Person(Person&&) noexcept;

    virtual ~Person();

    Person &operator=(const Person & other);
    Person &operator=(Person &&other) noexcept;

    char *getName() const;
    int getAge() const;

private:
    char *name;
    int age = 0;
};

资源:

Person::Person() : age(0)
{
    this->name = new char[100];
    memset(this->name, 0, sizeof(char)*100);
}

Person::Person(const char * name, int age) : Person()
{
    std::strcpy(this->name, name);
    this->age = age;
}

Person::Person(const Person &person)
{
    if(this == &person)
    {
        return;
    }
    //delete[](name);
    this->name = new char[100];
    memset(this->name, 0, sizeof(char)*100);
    std::strcpy(name, person.name);
    age = person.age;
}

Person::Person(Person &&other) noexcept
{
    if(this == &other)
    {
        return;
    }
    //delete[](name);
    name = other.name;
    age = other.age;
    other.name = nullptr;
    other.age = 0;
}

Person &Person::operator=(const Person &other)
{
    if(this == &other)
    {
        return *this;
    }
    delete[](name);
    name = new char[100];
    memset(name, 0, sizeof(char)*100);
    std::strcpy(name, other.name);
    age = other.age;
    return *this;
}

Person &Person::operator=(Person &&other) noexcept
{
    if(this == &other)
    {
        return *this;
    }
    delete[](name);
    name = other.name;
    age = other.age;
    other.name = nullptr;
    other.age = 0;
    return *this;
}

Person::~Person() {
    delete[](name);
    name = nullptr;
}

现在的问题是:是否真的需要在copyandmove构造函数中检查是否相等this==&other因为它是构造函数,所以不可能与其他函数相等。并且还需要在copymove构造函数中我们delete(释放)内存吗?由于尚未分配内存,为什么需要删除它?我之所以这样说,是因为我在许多C ++教程中看到他们删除了内存并检查是否相等。

因此,如果我是对的,那么copyandmove构造函数可以这样写:

Person::Person(const Person &person) : Person()
{
    std::strcpy(name, person.name);
    age = person.age;
}
Person::Person(Person &&other) noexcept
{
    name = other.name;
    age = other.age;
    other.name = nullptr;
    other.age = 0;
}

还有,检查move分配是否相等

Person &Person::operator=(Person &&other) noexcept

谢谢!

Lorisleitner

我想了解C ++复制/移动构造函数和相等运算符...

我认为您是指赋值运算符operator=等于运算符为operator==

如果this ==&other,它真的需要在复制和移动构造函数中检查是否相等吗?

不,您不需要像已经说明的那样。

是否需要在复制和移动构造函数中删除(释放)内存?

您需要在移动和复制分配中使用它,因为必须释放旧的内存才能复制(或只是将指针设置到)另一个的内存Person您的构造函数不需要删除。

所以如果我是对的,那么复制和移动构造函数可以这样写

是的,这些是正确的。您确定真的要为每个人固定100个字节吗?

另外,检查移动分配是否相等?

我不会在移动分配中检查是否相等,因为移动是一项非常便宜的操作,并且您不太可能分配相同的对象。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

删除默认C ++复制和移动构造函数和赋值运算符的缺点?

复制构造函数,赋值运算符C ++

C ++:“ T a = b”-复制构造函数或赋值运算符?

C ++中的赋值运算符模板和复制构造函数

C++中的复制构造函数和赋值运算符

C ++向量复制构造函数和赋值运算符是否还会复制保留空间?

在 C++ 中使用带有字符串的复制构造函数和/或赋值运算符时堆栈溢出

C++ 三元运算符调用复制构造函数而不是移动构造函数

C ++-没有复制构造函数或赋值运算符的数组操作

在c ++ 98中实现move构造函数和move赋值运算符,以实现更好的性能

即使类未定义构造函数,也无法在类上调用C ++默认移动赋值运算符

C ++是否为纯虚拟类创建默认的“构造函数/析构函数/复制构造函数/复制赋值运算符”?

依赖项没有复制构造函数或赋值运算符时的 C++ 初始化器列表

如何为包含 shared_ptr 的类创建复制构造函数/赋值运算符?C++

C ++复制赋值运算符类

C ++复制构造函数和=运算符中的重载情况

复制构造函数和Assignemnt运算符重载在C ++中不起作用

C++ 类对象复制构造函数和运算符=

5复制和移动(构造函数和赋值)的C ++规则警告:复制或移动

C ++赋值运算符和重载

C ++构造函数和运算符问题

C ++链表-构造函数和运算符重载

C ++:运算符new和default构造函数

移动构造函数和移动赋值运算符与复制省略

为什么在C ++ 11或C ++ 14中,当我声明移动赋值运算符时,编译器会隐式删除副本构造函数?

复制构造函数和复制赋值运算符?

隐式移动构造函数和赋值运算符

复制构造函数和默认赋值运算符

通过赋值运算符的C ++动态数组的深层复制