2

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

// 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. 在野外,我会不会根本不写三巨头成员,因为Point班级只是两个数字?编译器会正确且最佳地编写操作吗?
4

2 回答 2

2
  1. 复制和交换是最佳实践。std::swap如果你因为不熟悉模板不想重写,那么你也可以写一个swap_points函数或者Point::swap(Point &other)成员函数。

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

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

于 2012-07-15T21:58:15.360 回答
2

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

// Point.cpp

Point & operator=(Point source);
    m_x = source.m_x;
    m_y = source.m_y;

    return *this;
}
于 2012-07-15T21:59:59.417 回答