返回一个对象 我一直在学习C++,但是我很难理解对象函数/方法返回对象的方式。下面是我在《21天的书》中自学C++的文章。

返回一个对象 我一直在学习C++,但是我很难理解对象函数/方法返回对象的方式。下面是我在《21天的书》中自学C++的文章。,c++,return,return-type,C++,Return,Return Type,所以,我理解类和对象,只是不太了解返回对象。我将提供一个示例(目前正在学习运算符重载) 我只是对返回类型感到困惑。这个方法说它应该返回对计数器对象的引用,但是当对象被 return *this; 我们不只是返回类计数器的对象吗?为什么函数头说我们要返回对计数器对象的引用?为什么方法头不说返回类型是Counter类型的对象?这就是我感到困惑的地方:\ 我的想法是,由于引用基本上是某个对象的别名,因此返回一个取消引用的指针就像返回对象别名一样,因为对象具有帮助我们识别它们的名称。我真的不知道,我希

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

我只是对返回类型感到困惑。这个方法说它应该返回对计数器对象的引用,但是当对象被

return *this;
我们不只是返回类计数器的对象吗?为什么函数头说我们要返回对计数器对象的引用?为什么方法头不说返回类型是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
(以及通过值返回,上面的示例仅用于说明)是没有意义的。它实际上应该返回对非常量的引用。比如

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

我们不只是返回类计数器的对象吗

否,这将返回对对象的引用

*
运算符是解引用运算符。此运算符的结果是指针指向的对象的引用<代码>这是一个指针

关于引用,当在非引用上下文中使用时,它们会自动“转换”为引用对象

T *t;

// ...

T u = *t;
正如我所说,
*
操作符的结果是一个引用。然后,在非引用上下文中使用结果,即分配给另一个本身不是引用的对象。这将最终解析为引用对象,从而生成一个副本

介绍性C++引物通常会声明'*p '解析为指针指向的对象。这只是一个善意的小谎言。这仅在非引用上下文中是正确的。这就剩下了解析为引用的中间步骤,然后将引用解析为被引用对象

T *t;

// ...

T u = *t;

在此,在一个典型的介绍性C++入门中,引用还没有被提出来作为一个话题。因此,为了避免混淆,省略了这个中间步骤。但是现在你已经了解了一些关于参考资料的知识,你需要做一些心理调整:


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

该方法在使用
itsVal
1
修改对象后返回类对象本身

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

我的想法是,由于引用基本上是某个对象的别名,因此返回一个取消引用的指针就像返回对象别名一样

是的,完全正确。该函数返回调用该函数的对象的别名。它不会复制要返回的对象

调用代码可能如下所示:

Counter c;
do_something( ++c + 5 );
由于
++c
c
返回了一个别名,因此此代码的行为类似于:

++c;
do_something( c + 5 );

在不制作任何不必要的
c

副本的情况下,返回“类Couter的对象”将创建副本(第二个实例),这种编程方式的主要思想是对对象的同一实例使用点运算符。对不起,我的英语,无法解释更多。同意@Sam Varshavchik,多点运算符技术是先进的(这种符号是其中的一部分)。通过值/参考示例学习基本。你确定有一个
const
?这是非常不传统和不切实际的,与内置前缀
++
不同。是的,我已经得到了这本书的PDF版本,并且复制了函数定义本身。事实上,有一个“const”:学习C++的“21天内自学C++”似乎是个坏主意。@21天内掌握C++是不可能的。(2) 找一本更好的书。@Pistax是的,这是一本适合初学者的好书。可能比“21天内”更难,这是值得的。顺便说一句:看看我编辑过的答案,返回对const的引用在这里没有意义。这可能是这本书的错误之一。嗯……这解释了为什么我不理解作者在这里做的一些事情。非常感谢您指出这些缺陷。我想我得开始读另一本书了。非常感谢你和其他人的帮助:@Pistax哦,读那本书似乎更难。无论如何,祝你好运,换书之后。:)
*t
的结果是
t
类型的左值。不是一个引用(不管它是什么意思),当然不是
T&
。没有“参考语境”和“非参考语境”这样的东西。你答案的每一部分都是荒谬和令人困惑的。