我目前正在学习 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指针是如何返回的?
.
我尝试过在线查找资源,但我仍然很难完全掌握这些概念。任何解释或见解将不胜感激
- 在此上下文中
指针的用途是什么?它是如何运作的?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;
- 和
方法中setNum
的含义吗?为什么我们返回当前实例的引用?displayNum
obj.setNum(10).displayNum();
由于
setNum()
返回对
obj
的引用,因此 displayNum()
也会在 obj
上被调用。
为什么我们使用引用(这取决于你想做什么。在某些“setter”方法中,人们更喜欢不返回任何内容,或者返回之前的值。在您获得
MyClass&
- )作为这些方法的返回类型?返回引用而不是值或指针有什么优点?
MyClass
的应用程序中,他们似乎想要链接。
链接是让这样的事情发挥作用的原因:if ( (a = func()) > 10 ) { ... }
在上面,
operator=
返回对
a
的引用。然后可以将其用于与 10
进行比较。如果赋值运算符是 void
,则需要将上面的内容拆分为 ...a = func();
if (a > 10) { ... }
如果方法
setNum
和
displayNum
是 void
方法,则代码必须如下所示:MyClass obj;
obj.setNum(10);
obj.displayNum();
链接可以实现漂亮而简洁的代码,但正如注释链接中的一些答案所暗示的那样,它可能会使调试变得有点棘手。
我不认为这个特定实例中的链接可以改进代码,而且我可能不会这样编写。但同样,评论的链接中有一些很好的例子,其中链接看起来是一个很好的方法。
回答您的其他问题:
this
nullptr