C++ 中的深度复制构造函数

Deep copy constructor in C++

提问人:aurora 提问时间:5/8/2022 更新时间:5/8/2022 访问量:265

问:

该程序旨在为 Foo 创建一个深度复制构造函数。下面是类定义:

class Foo {
  int _cSize;
  char *_cValues;
  std::vector<int> _iValues;
  double _dValues[100];

public:
  double &dValues(int i) { return _dValues[i]; }
  int &iValues(int i) { return _iValues[i]; }
  char &cValues(int i) { return _cValues[i]; }
  int cSize(void) const { return _cSize; }
  Foo(void) : _cSize(100), _cValues(new char[_cSize]) {}

};

下面是复制构造函数的实现:

Foo &Foo::operator=(const Foo& foo) {
    _cSize = foo._cSize;
    _cValues = new char [_cSize];
    for (int i = 0; i < _cSize; i++) {
      _cValues[i] = foo._cValues[i];
    }
    _iValues = foo._iValues;
    for (int i = 0; i < 100; i++) {
      _dValues[i] = foo._dValues[i];
    }
    return *this;
}

但是,显示错误“隐式声明的复制赋值运算符的定义”。关于如何修复复制构造函数的任何建议?operator=

C++ 复制构造函数 Deep-Copy

评论

3赞 jabaa 5/8/2022
你没有声明operator=
0赞 273K 5/8/2022
Foo 没有声明赋值运算符,因此您正在尝试定义隐式运算符。
1赞 user17732522 5/8/2022
不要使用原始指针。改用 或 代替,则完全不必定义复制操作。编译器将自动生成正确的深度复制。std::stringstd::vector<char>
1赞 Remy Lebeau 5/8/2022
此代码中未显示任何复制构造函数。此代码中是复制赋值运算符,而不是复制构造函数。事实上,如果正确实现复制赋值运算符,则最好使用复制构造函数来实现。operator=
0赞 WhozCraig 5/8/2022
此外,显示的复制赋值运算符会泄漏内存(由 指向的原始内容)。_cValues

答:

0赞 Chris HazardXD 5/8/2022 #1

复制构造函数类似于

class Foo {
  // ...

  public:
    Foo(const Foo& op) {
      // copy fields
    }
};

请注意,它们是构造函数,就像您声明的 Foo(void) 一样,但它们有一个参数是常量引用。

另请参阅:复制构造函数和 = C++ 中的运算符重载:通用函数可能吗?