重载/移动操作的重载赋值运算符?

时间:2016-11-27 05:24:44

标签: c++ copy move

我正在讨论重载运算符的基础知识,特别是赋值运算符。我试图通过以下方式理解在指示复制和移动行为中使用重载:

operator overloading

我发现他们给出的例子很不清楚。

这是我到目前为止用来说明重载的基本代码。如何编辑此代码以说明在自定义复制和移动行为中使用重载?

class Distance
{
public:
    int feet, inches;

    Distance()
    {
        feet = 0;
        inches = 0;
    }

    Distance(int f, int i)
    {
        feet = f;
        inches = i;
    }

    auto operator=(Distance &D)->void //Use operator to perform additional operation (adding 100)
    {
        feet = D.feet + 100;
        inches = D.inches + 100;
    }
};

int main()
{
    Distance D1;
    D1.feet = 10;
    D1.inches = 12;
    Distance D2;
    D2 = D1;
    std::cout << D2.feet << std::endl;
}

1 个答案:

答案 0 :(得分:-1)

你不应该像那样使用赋值运算符(即使你可以)。具有附加操作的分配操作符可用于例如计算进行了多少分配。以这种方式改变数据会导致在使用界面时出现混淆和人为错误。您期望代码以某种方式工作,在赋值运算符的情况下,它是复制值。只需按照内置类型的工作方式,以这种方式实现重载运算符。你不会为运算符+()乘以体积,对吗?这没有任何意义。

在这种情况下的附加操作可以是例如:

static int assignmentCount = 0;

auto operator=(Distance &D)->void 
   {
     feet=D.feet;
     inches=D.inches;
     std::cout << "Made assignment"; //Just some debug stuff
     assignmentCount++;              //Count assignments made
   }

不要忘记,你已经将void作为返回类型,这使得你无法执行以下操作D1 = D2 = D3,这在某些情况下可能很有用。返回对接收值的引用是常见的做法。

我建议阅读Marc Gregoire的专业C ++,或Stroupstrup的书籍之一。我最近的经验是,在线资源可能导致某种混乱,书籍通常更适合学习基础知识。