返回对象混淆

Returning an object confusion

本文关键字:对象 返回      更新时间:2023-10-16

我一直在学习c++,但是我很难理解成员函数/方法返回对象的方式。我正在学习《21天自学c++》这本书。

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

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

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

解除对对象的引用时
return *this;

我们不只是返回一个类Counter的对象吗?为什么函数头说我们返回一个计数器对象的引用?为什么方法头不直接说返回类型是Counter类型的对象?这就是我感到困惑的地方:

我思考的方式是,因为引用基本上是某物的别名,返回一个解引用指针就像返回对象别名一样,因为对象具有帮助我们识别它们的名称。我真的不知道,我希望这里有人能给我解释一下

我们不只是返回一个类Counter的对象吗?

是的,我们正在返回一个对象。但是,它是通过引用或值返回的,是由函数声明中的返回类型决定的,我们不能在返回语句中确定(或区分)它们。

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;
}

BTW:对于前缀operator++,通过引用const返回(以及通过值返回,上面的示例仅用于说明)是没有意义的。它实际上应该返回对非const的引用。如

Counter& Counter::operator++() // return by reference (to non-const)
{
    ++itsVal;
    return *this;
}

我考虑的方式是,因为引用基本上是一个别名的东西,返回一个解引用指针就像返回对象的别名

是的,完全正确。该函数返回调用该函数的对象的别名。它不创建该对象的副本以返回。

调用代码可能看起来像:

Counter c;
do_something( ++c + 5 );

由于++c返回了c的别名,这段代码将表现为:

++c;
do_something( c + 5 );

不复制任何不必要的c

返回*;

我们不只是返回一个类Counter的对象吗?

不,这返回一个对对象的引用。

*操作符是解引用操作符。该操作符的结果是对指针所指向对象的引用。this是一个指针

关于引用的问题是,当在非引用上下文中使用时,它们最终会自动"转换"为被引用的对象。

T *t;
// ...
T u = *t;
如前所述,*运算符的结果是一个引用。然后,结果在非引用上下文中使用,即赋值给另一个本身不是引用的对象。这最终会解析到被引用的对象,从而产生一个副本。

c++入门通常会声明'*p'解析为指针所指向的对象。这只是一个善意的小谎言。这只在非引用上下文中成立。这就剩下了解析到引用的中间步骤,然后再将引用解析到被引用的对象。

在这一点上,在典型的c++入门中,参考文献还没有作为一个主题被提出来。为了避免混淆,省略了中间步骤。但是现在你知道了一些关于引用的知识,你需要做一些心理齿轮调整:

*给出了指针指向的对象的引用。当在引用上下文中使用时:也就是说,将结果赋值给引用,将结果作为参数传递给作为引用的函数,或者从函数返回引用,您将获得该引用。在所有其他非引用上下文中,您最终将获得引用引用的对象,这通常涉及到对象的副本。

方法返回用itsVal + 1修改后的类对象本身。

您可以使用counter_object++自增,然后调用其他函数。如(counter_object++).func(),无需创建另一个对象