回归对象混乱

时间:2016-09-03 12:46:28

标签: c++ return return-type

我一直在学习C ++,但是我无法理解成员函数/方法返回对象的方式。我正在关注“在21天内自学C ++”一书。

所以,我理解类和对象,而不是返回一个对象。我将提供一个示例(目前正在学习运算符重载)。

const Counter& Counter::operator++()
{
    ++itsVal;
    return *this;
}

我真的对返回类型感到困惑。此方法表示它应该返回对计数器对象的引用,但是当使用

取消引用该对象时
return *this;

我们不是只返回班级计数器的对象吗?为什么函数头说我们正在返回对计数器对象的引用?为什么方法头只是说返回类型是Counter类型的对象?这是我感到困惑的地方:\

我正在考虑的方式是,因为引用基本上是某个别名的别名,所以返回一个解除引用的指针就像返回对象别名一样,因为对象具有帮助我们识别它们的名称。我真的不知道,我希望有人可以向我解释一下。

4 个答案:

答案 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 );

由于++cc返回了别名,因此此代码的行为类似于:

++c;
do_something( c + 5 );

没有制作任何不必要的c副本。

答案 2 :(得分:1)

  

return * this;

     

Aren我们只是返回了Counter类的对象?

不,这会返回对象的引用。

*运算符是解除引用运算符。此运算符的结果是对指针指向的对象的引用。 this是一个指针。

关于引用的事情是,当在非引用上下文中使用时,它们自动最终得到转换"引用的对象。

T *t;

// ...

T u = *t;

正如我所说,*运营商的结果是一个参考。然后,结果用于非引用上下文,即分配给另一个对象,该对象本身不是引用。这最终会解析为引用的对象,从而产生副本。

介绍性C ++引物通常会说明' * p'解析为指针指向的对象。这只是一个小小的谎言。仅在非参考上下文中才是这样。这留下了解析引用的中间步骤,然后解析对引用对象的引用。

此时,在典型的C ++入门介绍中,尚未提及参考文献作为主题。因此省略了这个中间步骤以避免混淆。但是现在您对引用有所了解,您需要进行一些精神齿轮重新调整:

*为您提供指针指向的对象的引用。在引用上下文中使用时:即,将结果分配给引用,将结果作为参数传递给作为引用的函数,或者从函数返回引用,您将获得该引用。在所有其他非参考上下文中,您最终将获得引用所引用的对象,这通常涉及制作对象的副本。

答案 3 :(得分:1)

该方法在使用itsVal1修改对象后返回类对象。

您可以使用counter_object++进行自我增量,然后调用其他函数。例如(counter_object++).func(),而不创建另一个对象。