我一直在学习C ++,但是我无法理解成员函数/方法返回对象的方式。我正在关注“在21天内自学C ++”一书。
所以,我理解类和对象,而不是返回一个对象。我将提供一个示例(目前正在学习运算符重载)。
const Counter& Counter::operator++()
{
++itsVal;
return *this;
}
我真的对返回类型感到困惑。此方法表示它应该返回对计数器对象的引用,但是当使用
取消引用该对象时return *this;
我们不是只返回班级计数器的对象吗?为什么函数头说我们正在返回对计数器对象的引用?为什么方法头只是说返回类型是Counter类型的对象?这是我感到困惑的地方:\
我正在考虑的方式是,因为引用基本上是某个别名的别名,所以返回一个解除引用的指针就像返回对象别名一样,因为对象具有帮助我们识别它们的名称。我真的不知道,我希望有人可以向我解释一下。
答案 0 :(得分:5)
Aren我们只是返回了Counter类的对象?
是的,我们正在返回一个对象。但是,它通过引用或值返回,由函数声明中的返回类型决定,我们无法在return语句中确定(或区分)它们。
const Counter& Counter::operator++() // return by reference (to const)
{
++itsVal;
return *this;
}
Counter Counter::operator++() // return by value. Note the body of function is the same.
{
++itsVal;
return *this;
}
顺便说一句:通过引用const
(以及值,上面的示例仅用于说明)返回前缀operator++
并不合理。它应该实际返回对非const的引用。如
Counter& Counter::operator++() // return by reference (to non-const)
{
++itsVal;
return *this;
}
答案 1 :(得分:2)
我正在考虑的方式是,因为引用基本上是某个别名的别名,所以返回一个解除引用的指针就像返回对象别名
是的,这是完全正确的。该函数返回调用函数的对象的别名。它不会使该对象的副本返回。
调用代码可能如下所示:
Counter c;
do_something( ++c + 5 );
由于++c
向c
返回了别名,因此此代码的行为类似于:
++c;
do_something( c + 5 );
没有制作任何不必要的c
副本。
答案 2 :(得分:1)
return * this;
Aren我们只是返回了Counter类的对象?
不,这会返回对象的引用。
*
运算符是解除引用运算符。此运算符的结果是对指针指向的对象的引用。 this
是一个指针。
关于引用的事情是,当在非引用上下文中使用时,它们自动最终得到转换"引用的对象。
T *t;
// ...
T u = *t;
正如我所说,*
运营商的结果是一个参考。然后,结果用于非引用上下文,即分配给另一个对象,该对象本身不是引用。这最终会解析为引用的对象,从而产生副本。
介绍性C ++引物通常会说明' * p'解析为指针指向的对象。这只是一个小小的谎言。仅在非参考上下文中才是这样。这留下了解析引用的中间步骤,然后解析对引用对象的引用。
此时,在典型的C ++入门介绍中,尚未提及参考文献作为主题。因此省略了这个中间步骤以避免混淆。但是现在您对引用有所了解,您需要进行一些精神齿轮重新调整:
*
为您提供指针指向的对象的引用。在引用上下文中使用时:即,将结果分配给引用,将结果作为参数传递给作为引用的函数,或者从函数返回引用,您将获得该引用。在所有其他非参考上下文中,您最终将获得引用所引用的对象,这通常涉及制作对象的副本。
答案 3 :(得分:1)
该方法在使用itsVal
加1
修改对象后返回类对象。
您可以使用counter_object++
进行自我增量,然后调用其他函数。例如(counter_object++).func()
,而不创建另一个对象。