3

我无法弄清楚我正在阅读的书的以下部分实际上是做什么的。

//this function supposed to mimic the += operator
Sales_data& Sales_data::combine(const Sales_data &rhs)
{
    units_sold += rhs.units_sold; // add the members of rhs into
    revenue += rhs.revenue;  // the members of ''this'' object
    return *this; // return the object on which the function was called
}

int main()
{
    //...sth sth

    Sales_data total, trans; 
    //assuming both total and trans were also defined...
    total.combine(trans);
    //and here the book says:
    //we do need to use this to access the object as a whole.
    //Here the return statement dereferences this to obtain the object on which the
    //function is executing. That is, for the call above, we return a reference to total.
    //*** what does it mean "we return a reference to total" !?
}

我应该说我以前对 C# 有一点了解,并且不太了解究竟是如何return *this;影响整个对象的。

4

3 回答 3

14

琐事

该函数正在返回对与自身相同的类型的引用,并且它返回...自身。

指针类型

因为返回的类型是引用类型(Sales_data&),并且this是指针类型(Sales_data*),所以你必须取消对它的引用,因此*this,它实际上是对我们调用成员函数的对象的引用

用法

它真正允许的是方法链接。

Sales_data total;
Sales_data a, b, c, d;

total.combine(a).combine(b).combine(c).combine(d);

有时是竖着写的:

total
    .combine(a)
    .combine(b)
    .combine(c)
    .combine(d);

我很确定你已经看到了:

cout << "Hello" << ' ' << "World!" << endl;

在上述情况下,重载operator<<返回对输出流的引用。

于 2013-07-26T21:35:02.903 回答
3

在调用total.combine(trans);中,Sales_data::combine(...)函数this作为指向的指针totalrhs对 的引用被调用trans。由于this是一个指向总数的指针,因此取消引用它只会导致total变量。

然后,由于Sales_data::combine(...)is的返回签名Sales_data &,它返回对;的引用。*this换句话说,对total.

于 2013-07-26T21:36:13.140 回答
3

在这种情况下,返回对 *this 的引用可以让您像这样链接函数调用

int main()
{
    Sales_data total, trans; 
    //sth..
    total.combine(trans1).combine(trans2);
    //etc
}

返回引用意味着它返回对对象的引用而不是副本。我想您正在阅读的这本书对参考资料有一个解释,但它也可以在网上的很多地方找到。

于 2013-07-26T21:38:47.593 回答