2016-11-27 93 views
0

我将回顾重载操作符的基础知识,特别是赋值操作符。我想了解使用口述副本超载,并按照这个移动的行为:复制/移动操作的重载赋值操作符?

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

您不应该使用这样的赋值运算符(即使可以)。例如,可以使用赋值运算符和附加操作来计算做出了多少赋值。以这种方式改变数据会导致界面使用过程中的混乱和人为错误。您希望代码以某种方式工作,在赋值运算符的情况下,它正在复制值。只需按照内置类型的工作方式和以这种方式实现重载操作符。你不会乘以operator +()的体积,对吧?这没有任何意义。

在这种情况下,其他操作可能是,例如:

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 
    } 

不要忘了,你已经把有空隙,例如返回类型,它禁止你做以下D1 = D2 = D3,这可能是在某些情况下很有用。返回参考价值是常见的做法。

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

+1

即使读完它,它仍然不清楚吗?或者究竟有什么担心吗? – holmicz

+0

对于那些不明白的人 - OP发表评论指出,Stroupstrup有关于赋值运算符的全部章节,只是为了说清楚。 – holmicz