理解“return *this”

问题描述 投票:0回答:2

我目前正在学习 C++ 中的面向对象编程,我正在尝试理解

this
指针、
return *this
以及引用的使用的概念。我遇到了一个演示这些概念的示例代码片段,但我仍然在努力完全理解它们如何协同工作。

这是示例代码:

#include <iostream>

using namespace std;

class MyClass {
public:
    MyClass& setNum(int num) {

        this->num = num;
        return *this;  
    }

    MyClass& displayNum() {
        cout << "Num: " << this->num << endl;
        return *this;  
    }
private:
    int num;
};

int main() {
    MyClass obj;
    obj.setNum(10).displayNum();  
    return 0;

}

这个例子中的this指针是如何返回的?

.

我尝试过在线查找资源,但我仍然很难完全掌握这些概念。任何解释或见解将不胜感激

c++ reference chaining
2个回答
1
投票
  1. 在此上下文中
    this
    指针的用途是什么?它是如何运作的?

this->num = num;
中,
this
用于告诉编译器它是应该分配给的
num
成员变量。仅使用
num = num;
,您可以将函数参数
num
分配给自身(无操作)。这是因为局部
num
(声明为函数参数)遮盖了成员变量
num
。通常最好“不要”有阴影。如果函数参数和成员变量具有不同的名称,则 this-> 可能已被删除。

displayNum

中,

this->
可以被删除。没有阴影,因此
num
指的是成员变量
num
。返回
*this
“取消引用”
this
,以便您可以返回对当前
MyClass
实例的引用。如果该函数被声明为返回
MyClass
而不是
MyClass&
,则
return *this;
将返回
MyClass
实例的副本。

有人可以解释一下
    return *this;
  1. setNum
    方法中
    displayNum
    的含义吗?为什么我们返回当前实例的引用?
    
    
它允许“链接”操作。示例:

obj.setNum(10).displayNum();

由于 
setNum()

返回对

obj
的引用,因此
displayNum()
也会在
obj
上被调用。

为什么我们使用引用(
    MyClass&
  1. )作为这些方法的返回类型?返回引用而不是值或指针有什么优点?
    
    
这取决于你想做什么。在某些“setter”方法中,人们更喜欢不返回任何内容,或者返回之前的值。在您获得
MyClass

的应用程序中,他们似乎想要链接。

链接是让这样的事情发挥作用的原因:

if ( (a = func()) > 10 ) { ... }

在上面,
operator=

返回对

a
的引用。然后可以将其用于与
10
进行比较。如果赋值运算符是
void
,则需要将上面的内容拆分为 ...
a = func();
if (a > 10) { ... }



0
投票

如果方法

setNum

displayNum
void
方法,则代码必须如下所示:
MyClass obj;
obj.setNum(10);
obj.displayNum();

链接可以实现漂亮而简洁的代码,但正如注释链接中的一些答案所暗示的那样,它可能会使调试变得有点棘手。

我不认为这个特定实例中的链接可以改进代码,而且我可能不会这样编写。但同样,评论的链接中有一些很好的例子,其中链接看起来是一个很好的方法。

回答您的其他问题:

    this
  • 指针只是指向类实例的指针。
    为什么不是值或指针?指针只是给调用者增加了责任,以确保它不是一个 
  • nullptr
  • 。返回指针没有任何好处,因为对象存在,并且我们可以在调用者知道对象存在的地方传递引用。 如果它是一个值,您将创建一个副本,而不是在初始对象上操作它。这很可能不是您想要的。
    
        
© www.soinside.com 2019 - 2024. All rights reserved.