c++ - 为什么 C++ 复制构造函数必须使用 const 对象?

标签 c++ copy-constructor

我明白当我们定义一个类的时候,类的拷贝构造函数是必要的,因为Rule of three状态。我还注意到复制构造函数的参数通常是 const 如下代码所示:

class ABC {
public:
    int a;
    int b;
    ABC(const ABC &other)
    { 
        a = other.a;
        b = other.b;
    }
}

我的问题是如果复制构造函数的参数不是 const 会发生什么:

class ABC
{
    public:
    int a;
    int b;
    ABC(ABC &other)
    { 
        a = other.a;
        b = other.b;
    }
}

我知道在某些情况下,如果复制构造函数的参数是 const,那么第二个实现会失败。此外,如果复制构造函数的参数是 const,则要复制的对象在此过程中不会更改其内容。但是,我确实注意到有些人仍然使用第二个实现而不是第一个。是否有任何理由首选第二种实现?

最佳答案

  • 从逻辑上讲,修改一个你只想复制的对象应该没有意义,尽管有时它可能有一些意义,比如你想存储这个次数的情况对象已被复制。但这可以与存储此信息的 mutable 成员变量一起使用,甚至可以针对 const 对象进行修改(第二点将证明这种方法的合理性)

  • 您希望能够创建 const 对象的拷贝。但是,如果您没有使用 const 限定符传递参数,则无法创建 const 对象的拷贝...

  • 你不能从临时引用创建拷贝,因为临时对象是右值,不能绑定(bind)到非常量引用。更详细的解释,我建议Herb Sutter's article on the matter

关于c++ - 为什么 C++ 复制构造函数必须使用 const 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16956693/

相关文章:

c++ - 为什么在这种情况下不调用复制构造函数?

c++ - 函数返回指向类的指针时是否调用复制构造函数?

c++ - 启动 URL - 跨平台 (C++)

c++ - LLVM 执行引擎找不到我的函数

c++ - 一个线程等待多个线程事件

c++ - std::array 复制语义

c++ - 创建的线程多于预期

c++ - 连接两个 std::vectors

c++ - 你能用英语尽可能简单地解释什么是复制构造函数以及我什么时候需要使用它吗

C++隐式转换构造函数调用