【问题标题】:Is Const important for Copy Constructor? [duplicate]Const 对 Copy Constructor 很重要吗? [复制]
【发布时间】:2015-05-12 05:54:03
【问题描述】:

我在 DEV C++ 上运行这个程序,它显示 const 错误。但在 Visual Studio 中它工作正常。现在 const 对复制构造函数很重要吗?

#include<iostream>
using namespace std;

class Test
{
   /* Class data members */
public:
   Test(Test &t) { /* Copy data members from t*/}
   Test()        { /* Initialize data members */ }
};

Test fun()
{
    cout << "fun() Called\n";
    Test t;
    return t;
}

int main()
{
    Test t1;
    Test t2 = fun();
    return 0;
}

【问题讨论】:

  • 这与复制构造函数无关。
  • @juanchopanza 是,main() 中的第二行使用复制初始化,编译失败。
  • @vsoftco 是的,但问题与复制构造函数无关。我可以提供一个在矩阵求逆中出现相同错误的示例。
  • 一些(尤其是较旧的)编译器不会强制限制将非const 引用(例如您的复制构造函数参数)绑定到临时对象(例如@987654325 返回的Test @的)。没什么大不了的,只需修复代码,以便复制构造函数通过const 引用接受。 VC++ 竭尽全力避免破坏旧代码,除非您根据重复的答案提供特定的命令行选项。
  • @juanchopanza 起初我认为 OP 也在询问拥有一个接受其参数的复制构造函数是否合法。通过非常量引用。

标签: c++ class oop constructor copy


【解决方案1】:

复制构造函数传统上声明为

Foo(const Foo&);

因为假设副本不会更改其右侧的对象(至少一个好的复印机不应该更改它,对吧?)

在标准 C++ 中,您不能将临时绑定到非const 引用。 Visual Studio 使用非标准扩展,这就是您的代码编译的原因,但您不应依赖非标准扩展。

你的复制构造函数通过const引用获取rhs并不是绝对必要的,通过引用获取它也是可以的。但在这种情况下,您将无法从右值(基本上是临时的)执行复制初始化。

【讨论】:

    猜你喜欢
    • 2011-01-26
    • 2023-03-18
    • 1970-01-01
    • 2013-05-29
    • 2019-12-31
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多