【问题标题】:Implementing copy assignment operator for Point class为 Point 类实现复制赋值运算符
【发布时间】:2012-07-15 21:48:05
【问题描述】:

考虑一个点类,其声明如下:

// Point.h
class Point {
    public:
        Point();                           // Default constructor
        Point(const Point & p);            // Copy constructor
        Point & operator=(Point source);   // Copy assignment operator, needs implemented
        ~Point();                          // Destructor
    // ...
    private:
        double m_x;                        // X coordinate
        double m_y;                        // Y coordinate
};

对于家庭作业,我唯一需要实现的是复制赋值运算符。
如何做到这一点的规范答案是copy-and-swap idiom

使用交换函数进行复制分配解决了一个问题并创建了另一个问题(如何实现交换函数)。

虽然我觉得不需要提供交换功能,但我不知道如何最好地实现交换。是专攻std::swap吗?我还不知道命名空间和模板专业化。

形式上,我的问题有两个:

  1. 应如何实施复制分配?如果它使用交换功能,我应该如何实现?
  2. 在野外,我会干脆不写Big Three members,因为Point 类只是两个数字?编译器会正确且最优地编写操作吗?

【问题讨论】:

  • 这里编译器生成的算子不够用吗?你没有你的班级正在管理的资源。
  • 这里编译器生成的版本应该够用了。但是作业要求实现所有这三个,以便练习。

标签: c++


【解决方案1】:
  1. 复制和交换是最佳做法。如果你因为不熟悉模板不想覆盖std::swap,那么你也可以写一个swap_points函数或者一个Point::swap(Point &other)成员函数。

    该(成员)函数的实现非常简单:只需对所有成员调用std::swap

  2. 是的,为这门课自己实现三巨头确实是一项学术练习。

【讨论】:

    【解决方案2】:

    天真的在这里工作,因为Point 不管理任何资源。
    简单地复制双精度值不会引发异常,因此这段代码是异常安全的(反过来也是自赋值安全的)。

    // Point.cpp
    
    Point & operator=(Point source);
        m_x = source.m_x;
        m_y = source.m_y;
    
        return *this;
    }
    

    【讨论】:

    • 没错,但是一旦你决定要在你的类上重载std::swap,这会导致重复代码。
    • 完全同意,我只是想检查一下我的推理是否正确。
    猜你喜欢
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 2017-11-21
    • 2011-06-09
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    相关资源
    最近更新 更多