3

因此,以下是在类外定义的类 Sales_data 的成员函数,

Sales_data& Sales_data::combine(const Sales_data &rhs) {
    units_sold += rhs.units_sold;
    revenue += rhs.revenue; //adding the members of rhs into the members of "this" object
    return *this;
} //units_sold and revenue are both data members of class

当函数被调用时,它被称为

total.combine(trans); //total and trans are the objects of class

我不理解的是函数返回*this,我知道它返回对象的一个​​实例,但它没有将该实例返回给我们在函数调用期间可以看到的任何东西,如果我不编写返回语句,它会工作吗有什么不同。

有人请详细解释,因为我只是不明白。

4

3 回答 3

6

这是进行下一个构建工作的常用方法:

Sales_data x, y, z;
// some code here
auto res = x.combine(y).combine(z);

你打电话时:

x.combine(y)

x已更改并x返回引用,因此您有机会combine()通过上一步返回的引用再次调用此更改的实例:

x.combine(y).combine(z);

另一个流行的例子是operator=()实现。因此,如果您operator=为自定义类实现,返回对实例的引用通常是一个好主意:

class Foo
{
public:
    Foo& operator=(const Foo&)
    {
        // impl
        return *this;
    }
};

这使得作业适用于您的班级,因为它适用于标准类型:

Foo x, y, z;
// some code here
x = y = z;
于 2017-07-05T10:47:45.657 回答
2

定义函数的一个好处return是,它允许像下面的代码一样连续调用:

// assuming that trans1 and trans2 are defined and initialized properly earlier
total.combine(trans1).combine(trans2);
// now total contains values from trans1 and trans2

这相当于:

// assuming that trans1 and trans2 are defined and initialized properly earlier
total.combine(trans1);
total.combine(trans2);
// now total contains values from trans1 and trans2

但它更简洁明了。

但是,如果您不需要或不喜欢使用早期版本,则可以将函数声明为 return void

于 2017-07-05T10:51:51.823 回答
1

我知道它返回对象的一个​​实例,但它没有将该实例返回给我们在函数调用期间可以看到的任何东西

正确,在这种情况下。

但是如果你愿意,你可以使用返回值。它在那里以防万一。

这是一个常见的约定,允许函数调用链接

另外,如果我不写 return 语句,它的工作方式会有什么不同。

它将具有未定义的行为,因为该函数具有返回类型,因此必须返回something。但是你可以在void不改变这个特定程序的功能的情况下创建返回类型,当然。

于 2017-07-05T10:49:41.887 回答