C ++ - вернуть ссылку на вызывающий объект - PullRequest
0 голосов
/ 17 марта 2020

Я читаю главу 7. Классы C ++ Primer от Стэнли Б. Липпмана Но у меня есть вопросы по этим кодам

struct Sales_data{
     string isbn() const { return bookNo;}
     Sales_data& combine(const Sales_data&);
     double avg_price() const;
     string bookNo;
     unsigned units_sold = 0;
     double revenue = 0.0;
};
Sales_data& Sales_data::combine(const Sales_data& rhs){
     units_sold += rhs.units_sold;
     revenue += rhs.revenue;
     return *this;
}

Что меня удивляет, так это метод, который возвращает ссылку на вызывающий объект Sales_data, когда мы хотим изменить член объекта.

Я думаю, что вместо использования этого метода я могу объявить метод void, что я понимаю, когда объектный вызов объединяет метод, units_sold равно это-> единицы_продано и выручка составляет это-> выручка .

По этой причине я думаю, что мне не нужно использовать метод, который возвращает ссылку на вызывающий объект, когда я хочу изменить член объекта.

void Sales_data::combine(const Sales_data& rhs){
     units_sold += rhs.units_sold;
     revenue += rhs.revenue;
}
// Also change the function in the struct

I Мы проверили его, и метод void все еще может изменить член объекта, который вызывает метод объединения. Так есть ли различия между этими двумя методами?

Спасибо, что читаете и помогаете мне!

Ответы [ 2 ]

1 голос
/ 17 марта 2020

В вашем примере нет разницы. Рассмотрим вариант использования, когда кто-то хочет использовать результат combine для чего-то другого. Например:

Sales_data a;
Sales_data b;
// do stuff
Sales_data c = a.combine(b);

Скорее всего, это обычно происходит с помощью оператора присваивания, так что вы можете выполнять цепное присвоение.

Sales_data a, b, c;
// do suff
a = b = c;

Это также полезный шаблон при работе с строительный тип.

Builder b;
b.set_width(10)
 .set_height(100)
 .set_color(blue);
0 голосов
/ 17 марта 2020

См. Это,

#include<iostream>

using std::cout;
using std::endl;

class my
{
public:
    int i;
    my& combine(const my& ob);
};

my& my::combine(const my& ob)
{
    this->i+=ob.i;
    return *this;
}

int main()
{
    my ob1,ob2,ob3;

    ob1.i=2;
    ob2.i=2;
    ob3.i=2;

    ob1.combine(ob2).combine(ob3); //you can call member of the class of the returned reference 

    cout<<ob1.i<<endl;             //6

    my ob4=ob1.combine(ob2);       // calls copy constructor if present 
    cout<<ob4.i<<endl;             //8

    my ob5;
    ob5 = ob1.combine(ob2);        // call overloaded = operator if present 
    cout<<ob5.i<<endl;             //10
}

возврат ссылки или void - ваш вкус, но если вы возвращаете ссылку, полезно в некоторых вышеупомянутых ситуациях Но ничего плохого, если вы возвращаете void.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...