我正在讨论重载运算符的基础知识,特别是赋值运算符。我试图通过以下方式理解在指示复制和移动行为中使用重载:
我发现他们给出的例子很不清楚。
这是我到目前为止用来说明重载的基本代码。如何编辑此代码以说明在自定义复制和移动行为中使用重载?
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;
}
答案 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的书籍之一。我最近的经验是,在线资源可能导致某种混乱,书籍通常更适合学习基础知识。