gpt4 book ai didi

c++ - 为什么我们在重载赋值中使用 return *this ?

转载 作者:行者123 更新时间:2023-12-02 00:04:15 25 4
gpt4 key购买 nike

我是计算机科学专业的学生。请在回答之前仔细阅读我的问题

今天在 C++ 课上,我们学习了重载运算符,特别是赋值运算符,我的教授说了一些他不喜欢的话:“相信我。”他说这句话是指return *this约定。

我问:“但是为什么呢?”他的回答几乎是:“因为确实如此。”

我对这个答案不满意。

考虑以下因素:

class length
{
private:
int inches, feet, yards;
public:
//getters, setters, etc.
Length operator=(const Length& Q)
{
this->inches = Q.inches;
this->feet = Q.feet;
this->yards = Q.yards;
return *this;
}
};

根据无数问题和至少 3 本 C++ 书籍的研究,我了解到“约定”的存在是因为它允许链式赋值,但是为什么有必要以及如何实现它来了吗?

一个更深入的问题是 this 是如何做到的?是否有指向类属性的单独“子指针”(我的术语,非官方术语)(IE this->inches )?这是如何运作的?是this->inches只是一个偏移量还是什么?

我和我的教授非常感谢一个不仅仅是“因为事情就是这样完成的”的答案。

请并谢谢

编辑:我认为我已经清楚地写了这个问题;然而,根据我收到的答复,我认为存在沟通不畅的情况。我正在寻求理解该约定从何而来(我相信根源于 C)以及为什么会这样。

最佳答案

既然你对答案不满意“因为它是”,那么让我给你一个不同的答案:

重载运算符时,请按照 int 进行操作

该建议的原因是遵循最小惊喜原则,人们习惯于运算符(operator)以现有类型的特定方式进行外观和行为。当他们将运算符与您的类型一起使用时,隐含着期望它的行为相同。

现在下一个问题是为什么int会这样?对此我没有明确的答案。它支持一些奇特的语法,例如:(a = 3) = 5++(a = 3)(x = y).change(),但尚不清楚这三种情况的真正值(value)是什么。在第一种情况下,您可以直接分配 5,在其他两种情况下,将表达式重写为两个单独的表达式将使代码更具可读性。

我故意避免了前面参数中的 a = b = c 的情况,因为这种情况支持了运算符应该产生或引用的想法以便可以在以后的赋值中使用它,但是约定是返回一个可修改的引用,而上面的表达式不需要这样做。 const & 足以支持上述语法。 [话又说回来,真的需要这种语法吗?将其分成两个语句的成本是多少?这样不是更具可读性吗? (在许多情况下可能会更好,在某些情况下可能不会)]。

无论如何,要记住的教训是遵循“最小惊喜原则”,无论是什么原因导致所有基本或其他标准类型的这种行为,一旦它成为一个习语最好只是遵循它。

关于c++ - 为什么我们在重载赋值中使用 return *this ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21924043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com