因此,以下是Class 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
的函数,
我理解它会返回一个对象的实例,但它并没有将这个实例返回给我们在函数调用期间可以看到的任何内容,如果我不写反函数,它是否会以不同的方式工作。
有人请详细解释,因为我没有得到它。
答案 0 :(得分:5)
这是进行下一次施工的常用方法:
Sales_data x, y, z;
// some code here
auto res = x.combine(y).combine(z);
致电时:
x.combine(y)
x
已更改,并且返回了对x
的引用,因此您有机会再次通过在prevous步骤上返回的引用来调用此已更改实例上的combine()
:< / p>
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;
答案 1 :(得分: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
但它更简洁,更简洁。
但是,如果您不需要或不想使用早期版本,则可以声明该函数以返回void
。
答案 2 :(得分:1)
我理解它会返回一个对象的实例但它没有将该实例返回给我们在函数调用期间看到的任何内容
在这种情况下,正确。
但如果您愿意,可以使用返回值。它就是为了以防万一。
这是一个常见的约定,允许函数调用链接。
另外,如果我不写return语句,它会以不同的方式工作。
它会有未定义的行为,因为该函数具有返回类型,因此必须返回某些内容。但是你可以在不改变这个特定程序功能的情况下制作返回类型void
,确定。