'this' C++ 中的指针行为
'this' pointer behaviour in c++
我对C++中的这个指针有基本的理解
#include<iostream>
using namespace std;
class Test
{
private:
int x;
int y;
public:
//Test (int x = 0, int y = 0) { this->x = x; this->y = y; }
Test setX(int a) { x = a; return *this; }
Test setY(int b) { y = b; return *this; }
void print() { cout << "x = " << x << " y = " << y << endl; }
};
int main()
{
Test obj1;
obj1.setX(10).setY(20);
obj1.print();
return 0;
}
我的问题是,当我在SetX和SetY函数中返回this指针,但没有将返回类型声明为指针时,编译器为什么不报告错误?
这是因为您返回的是*this
而不是this
。
this
是指向类型为Test
的对象的指针。这意味着this
-变量基本上保存了存储对象的地址。要访问this
指向的对象,请使用*
。
因此,您正在返回this
指针指向的实际对象。
编辑
代码不能按您希望的方式工作的问题是由您正在处理堆栈这一事实引起的。
让我们看看地址:
#include<iostream>
using namespace std;
class Test
{
private:
int x;
int y;
public:
//Test (int x = 0, int y = 0) { this->x = x; this->y = y; }
Test setX(int a) { x = a; return *this; }
Test setY(int b) {
y = b;
cout << this << endl; // >> 0x29ff18
return *this;
}
void print() { cout << "x = " << x << " y = " << y << endl; }
};
int main()
{
Test obj1;
cout << &obj1 << endl; // >> 0x29ff10
obj1 = obj1.setX(10).setY(20);
cout << &obj1 << endl; // >> 0x29ff10
//obj1.setY(20);
obj1.print();
return 0;
}
如您所见,与main
相比,this
指向的对象在setY
方法中的地址不同。这是因为对象被复制到setY
方法的堆栈帧中,所以在setX
和setY
中,您使用的是obj1
的副本
如果您正在执行obj1.setX(10).setY(20);
,则基本上复制对象obj1
并在setX
中使用它,然后在setY
中使用setX
的返回对象。如果要保存最后一个副本,则必须将其重新分配给obj1
您的问题解决方案有效,但效率极低。描述正在发生的事情的最后一段是不正确的。setx是用obj1调用的,并使用obj1。sety使用obj1的副本进行调用。然后分配obj1由sety返回的obj1副本的副本。地址不会更改,因为obj1的存储正在被覆盖,而不是被替换。添加一个复制构造函数和一个赋值运算符,您就可以观察实际发生的事情。建议的解决方案是在整个过程中使用对同一对象的引用,并根据@πάγτα进行链接ῥεῖ 's的答案如下user4581301
我的问题是,当我在SetX和SetY函数中返回this指针,但没有将返回类型声明为指针时,编译器为什么不报告错误?
这是完全有效的语法,因此编译器不应该返回错误消息。问题是您使用的是返回类型为this*
的副本。
要正确连锁操作以在原始实例上操作,请返回对this
:的引用
Test& setX(int a) { x = a; return *this; }
// ^
Test& setY(int b) { y = b; return *this; }
// ^
否则,您将返回一个不相关的类副本。
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错