赋值运算符重载:返回 void 与返回引用参数 [duplicate]

Assignment operator overloading: returning void versus returning reference parameter [duplicate]

提问人:JoeBass 提问时间:2/20/2017 最后编辑:JoeBass 更新时间:2/20/2017 访问量:8828

问:

我在网上看到的一些赋值重载运算符示例如下所示:

#include <iostream>
using namespace std;

class Distance {
   private:
      int feet;             // 0 to infinite
      int inches;           // 0 to 12
   public:
      // required constructors
      Distance(){
         feet = 0;
         inches = 0;
      }

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

      void operator = (const Distance &D ) { 
         cout << "assigning..." << endl;
         feet = D.feet;
         inches = D.inches;
      }

      // method to display distance
      void displayDistance() {
         cout << "F: " << feet <<  " I:" <<  inches << endl;
      }

};

int main() {
   Distance D1(11, 10), D2(5, 11);

   cout << "First Distance : "; 
   D1.displayDistance();
   cout << "Second Distance :"; 
   D2.displayDistance();

   // use assignment operator
   D1 = D2;
   cout << "First Distance :"; 
   D1.displayDistance();

   return 0;
}

它们从重载函数返回 void。如果 D1 是被调用的对象,这对我来说是有意义的。

其他示例返回对类对象的引用。

#include <iostream>
using namespace std;

class Distance {
   private:
      int feet;             // 0 to infinite
      int inches;           // 0 to 12
   public:
      // required constructors
      Distance(){
         feet = 0;
         inches = 0;
      }

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

      Distance& operator = (const Distance &D ) { 
         cout << "assigning..." << endl;
         feet = D.feet;
         inches = D.inches;
         return *this;
      }

      // method to display distance
      void displayDistance() {
         cout << "F: " << feet <<  " I:" <<  inches << endl;
      }

};

int main() {
   Distance D1(11, 10), D2(5, 11);

   cout << "First Distance : "; 
   D1.displayDistance();
   cout << "Second Distance :"; 
   D2.displayDistance();

   // use assignment operator
   D1 = D2;
   cout << "First Distance :"; 
   D1.displayDistance();

   return 0;
}

这对我来说没有意义(考虑到第一个例子)。如果在第一个示例中调用类似 的东西,为什么第二个示例在这种情况下会起作用?是不是有点像?归根结底,这有什么不同吗?D1 = D2;D1.=(D2);D1 = D1.=(D2);

C++ 重载 赋值运算符

评论

0赞 Sam Varshavchik 2/20/2017
“.+”是什么意思???
0赞 JoeBass 2/20/2017
我的意思是 + 是函数名称。所以调用 D1 的 + 函数。哦,我明白。。它应该是 =....D1 的 = 函数...我正在编辑。
0赞 zett42 2/20/2017
en.cppreference.com/w/cpp/language/copy_assignment

答:

5赞 songyuanyao 2/20/2017 #1

按照惯例,赋值运算符通常返回引用 (to );这样就可以链接赋值,就像这些内置类型的行为一样。例如*this

Distance D1, D2, D3;
D1 = D2 = D3;

对于 ,它等价于 。对于第二种情况,它不会改变,返回的值只是被丢弃。对于 ,它等价于 。请注意,返回的值(即对 的引用)用作 上调用的赋值运算符的参数。D1 = D2;D1.operator=(D2);D1 = D2 = D3;D1.operator=(D2.operator=(D3));D2D1

评论

1赞 M.M 2/20/2017
您也可以将其用作子表达式,例如 ,或 ,尽管某些风格指南不鼓励这样做。while (D1 = D2)(D1 = D2).foo()
15赞 Sergey Kalinichenko 2/20/2017 #2

尽管 C++ 语言允许您使用任何返回类型重载赋值运算符,包括 ,但应强烈考虑遵循从运算符返回对被分配者的引用的广泛约定。void

其基本原理是

A = B;

无论作业返回什么,都会起作用,而

A = B = C;

这是一个完美的赋值链将中断,除非返回与赋值兼容的东西(通常是与 相同类型的对象)。B = CAA

另一个问题是,例如,必须将对象作为较大表达式的一部分进行比较

mytype obj;
while ((obj = read_obj(cin)) != END_OBJ) {
    ...
}

因此,返回的最大缺点是无法链接分配并在不允许的地方使用它们。voidvoid