2017-02-20 178 views
1

一些赋值操作符重载的例子,我在网上看到的这个样子的:赋值运算符重载:void返回回访参考参数

#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);?在一天结束时它有什么不同吗?

+0

你是什么意思。 “+” ??? –

+0

我的意思是+是函数名称。所以请拨打D1的+功能。哦,我明白了......它应该= ...... D1's =功能......我在编辑。 – JoeBass

+0

http://en.cppreference.com/w/cpp/language/copy_assignment – zett42

回答

2

根据约定,分配操作者通常返回参考(以*this);这使得可以链接分配,就像这些内置类型的行为一样。例如

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

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

+1

您也可以用它作为子表达,例如'虽然(D1 = D2)'或者(D1 = D2).foo()',尽管一些风格指南不鼓励这样做。 –

3

虽然C++语言,您可以重载赋值运算符与任何返回类型,包括void,你应该认真考虑下返回从操作受让人参考的普遍惯例。

它的基本原理是

A = B; 

将工作无论什么分配收益,而

A = B = C; 

这是任务的完美链条将打破,除非B = C回报的东西勘定与A兼容(通常是与A相同类型的对象)。

的另一个问题是在情况下,当必须将对象的比较结果为一个更大的表达式的一部分,例如

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

因此,为了返回void最大的缺点是无法链作业和在地方使用它们void是不允许的。