c++ - 这是好代码吗? (复制构造函数和赋值运算符)

标签 c++ operator-overloading copy-constructor

出于某种原因,我不得不为我的类提供复制构造函数和 operator=。如果我定义了一个复制构造函数,我认为我不需要 operator=,但是 QList 需要一个。撇开这个不谈,我讨厌代码重复,所以这样做有什么问题吗?

Fixture::Fixture(const Fixture& f) {
    *this = f;
}

Fixture& Fixture::operator=(const Fixture& f) {
    m_shape         = f.m_shape;
    m_friction      = f.m_friction;
    m_restitution   = f.m_restitution;
    m_density       = f.m_density;
    m_isSensor      = f.m_isSensor;
    return *this;
}

只是出于好奇,没有办法切换它以便大部分代码都在复制构造器中并且 operator= 以某种方式利用它?我试过 return Fixture(f); 但它不喜欢那样。


看来我需要更清楚地说明复制构造函数和赋值运算符已被我继承的类隐式禁用。为什么?因为它是一个抽象基类,不应该单独实例化。然而,这个类应该是独立的。

最佳答案

这很糟糕,因为 operator= 不能再依赖于设置对象了。你应该反过来做,并且可以使用复制交换惯用语。

在您只需复制所有元素的情况下,您可以使用隐式生成的赋值运算符。

在其他情况下,您必须另外做一些事情,主要是释放和复制内存。这就是复制交换习语的用武之地。它不仅优雅,而且还提供了这样一个赋值,如果它只交换基元就不会抛出异常。让我们创建一个指向您需要复制的缓冲区的类:

Fixture::Fixture():m_data(), m_size() { }

Fixture::Fixture(const Fixture& f) {
    m_data = new item[f.size()];
    m_size = f.size();
    std::copy(f.data(), f.data() + f.size(), m_data);
}

Fixture::~Fixture() { delete[] m_data; }

// note: the parameter is already the copy we would
// need to create anyway. 
Fixture& Fixture::operator=(Fixture f) {
    this->swap(f);
    return *this;
}

// efficient swap - exchanging pointers. 
void Fixture::swap(Fixture &f) {
    using std::swap;
    swap(m_data, f.m_data);
    swap(m_size, f.m_size);
}

// keep this in Fixture's namespace. Code doing swap(a, b)
// on two Fixtures will end up calling it. 
void swap(Fixture &a, Fixture &b) {
  a.swap(b);
}

我通常就是这样写赋值运算符的。阅读Want speed? Pass by value关于不寻常的赋值运算符签名(按值传递)。

关于c++ - 这是好代码吗? (复制构造函数和赋值运算符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1457842/

相关文章:

c++ - 如何控制返回对象的拷贝到新对象中?

c++ - Qt,C++ : QGraphicsScene coordinates are not working

python - Python 3.x 中的 `__rdiv__()` 和 `__idiv__` 运算符是否已更改?

C++ 类的复制构造函数

c++ - 这些 C++ 运算符重载有什么问题?

c++ - 为不适用于输出流的模板矩阵重载 "+"

C++:深度复制基类指针

c++ - 如何添加到已存储在集合中的集合?

c++ - 递归函数和二维数组 c++

c++ - 迭代器声明 : "does not contain a type"