【问题标题】:C++ copy-constructor and assignmentC++ 复制构造函数和赋值
【发布时间】:2012-02-12 13:44:45
【问题描述】:

我已经有很多次在我的脑海中钻过,如果提供了复制构造函数,则还必须提供赋值运算符。但是,有时类可以使用复制构造函数但不能使用赋值运算符。

例如:

class A {
public:
  const int myVar;

  A(const int var) : myVar(var) {};
  A(const A& other) : myVar(other.myVar) {};
};

所以这是一件可怕的事情吗?赋值运算符是否需要定义但私有?这样的类仍然可以复制构造吗?

【问题讨论】:

  • 这个类甚至不需要显式的复制构造函数,因为编译器生成的正是你想要的。
  • @R.MartinhoFernandes:我假设这是一个用于表达问题的简单代码示例。

标签: c++ copy-constructor assignment-operator


【解决方案1】:

那么这是一件可怕的事情吗?
不,不是。
并非所有类都需要可复制构造和可赋值。拥有可复制但不可分配的类是完全有效的。

这样的类仍然可以复制构造吗?
是的。
只要您的类提供public 复制构造函数,您的类就可以复制构造。

赋值运算符是否需要定义但私有?
这取决于您的使用情况。
如果您的班级需要可分配,那么理想情况下它不应该有const 成员。

如果您的类有const 成员,则默认编译器生成的复制赋值运算符将不起作用,因为它试图分配给不允许的 const 成员。因此,如果您的代码需要复制赋值运算符,则必须提供自己的重载版本。但是,无论如何,这个重载版本不能提供预期的赋值语义。

如果您的类对象不需要可分配,则不要定义它。如果你的代码不小心使用了它,编译器无论如何都会产生错误。

【讨论】:

  • 它不需要是可分配的,但它确实需要是可复制构造的。但是我习惯于总是被告知如果它有一个复制构造函数,它也必须有一个赋值运算符,但这在这里没有意义。
  • @tpg2114:这是C++03 中的三法则C++11 中的五法则,您参考这里。但是在大多数情况下,这是一个正确的准则。它不是标准强制执行的条件(尽管如果标准这样做会有所帮助)。类可以是可复制的,但不是可分配的,因此可以违反准则案例。
  • 三/五规则允许将一些必需的项目声明为私有,并且不执行它们。但它们应该被声明。您声明它们是因为您不希望编译器为您生成意外的东西,而不是因为您打算实际使用它们
  • @nm:在这种特殊情况下,OP 不需要提供任何重载声明,如果 OP 代码以某种奇怪的晦涩方式使用赋值,则会调用隐式复制赋值运算符并发出编译器错误(从const 成员开始)。它将实现通过不提供重载运算符的定义(而仅声明)来实现的目标,在这种情况下的优点是将在编译时检测到错误而不是在链接阶段和后一种情况一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-13
  • 2011-06-09
  • 2020-06-13
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多