返回对象混淆
Returning an object confusion
我一直在学习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()
,无需创建另一个对象
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 如何访问从 COM 对象返回的 VARIANT 数据类型中的安全数组C++?
- 从我的对象返回静态数组
- 将unique_ptr作为<Object>unique_ptr<常量对象返回>
- 从右值对象返回成员
- 视觉对象 返回 C++ 中的双精度值
- 为什么类型为 sf::Text 的对象返回不同的 getPosition().y 和 getLocalBounds().
- std::min_element 从类对象返回意外结果
- C++无效的对象返回语义
- const引用是否延长临时对象返回的临时对象的寿命
- 将 NULL 作为对象返回时未收到任何警告
- 如何在 C# 中从 com 对象返回数组(double[])
- 从重载运算符返回引用,并使用临时对象返回表达式
- Cin 对象返回值 c++
- 将变量作为类对象返回
- 使用可更改对象返回只读的最佳方法是什么
- 如何在Cython中从另一个包装对象返回包装的c++对象
- 当对象返回时,c++动态数组被清除
- 从带有动态字段的函数、对象返回
- 从堆栈上的匿名对象返回对*this的引用