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

Pau*_*nta 50 c++ constructor operators copy-constructor assignment-operator

如果我覆盖operator=,复制构造函数会自动使用new运算符吗?同样,如果我定义了一个拷贝构造函数,会operator=自动"继承"拷贝构造函数的行为吗?

sgo*_*les 44

不,他们是不同的运营商.

复制构造函数用于创建新对象.它将现有对象复制到新构造的对象.复制构造函数用于从旧实例初始化新实例.将值中的变量传递给函数或作为函数的返回值时,不一定要调用它.

赋值运算符用于处理已存在的对象.赋值运算符用于将现有实例更改为与rvalue具有相同的值,这意味着如果实例具有内部动态内存,则必须销毁并重新初始化该实例.

有用的链接:

  • 当按值将变量传递给函数或作为函数的返回值时,调用`....不一定.感谢RVO,当您按值返回时,可能无法调用复制构造函数. (6认同)

Eri*_*rik 12

否.除非您定义副本ctor,否则将生成默认值(如果需要).除非您定义operator =,否则将生成默认值(如果需要).它们彼此不使用,您可以单独更改它们.


Ale*_* C. 5

不,它们是不同的对象.

如果你担心的是复制构造函数和赋值运算符之间的代码重复,请考虑以下习语,名为copy和swap:

struct MyClass
{
    MyClass(const MyClass&); // Implement copy logic here
    void swap(MyClass&) throw(); // Implement a lightweight swap here (eg. swap pointers)

    MyClass& operator=(MyClass x)
    {
        x.swap(*this);
        return *this;
    }
};
Run Code Online (Sandbox Code Playgroud)

这样,operator=将使用复制构造函数来构建一个新对象,该对象将在函数出口处*this与之交换(与旧this内部交换).


归档时间:

查看次数:

62833 次

最近记录:

8 年,3 月 前