在C ++中明确传递* this

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

[阅读*this时,我看到:

当为对象调用非静态成员函数时,编译器将对象的地址作为隐藏参数传递给函数。

然后我尝试:

*this

为什么我无法访问隐藏的参数?因此将其称为“隐藏”吗?

仅允许编译器执行此操作吗?我们不能在函数签名中明确提及#include <iostream> class MyClass { int myVar; public: MyClass(const int& val) : myVar{val} {} // int getVar(MyClass* this) <-- Error: expected ',' or '...' before 'this' int getVar() { return this->myVar; } }; int main() { MyClass obj(22); // std::cout << obj.getVar(&obj); <-- Error: no matching function // std::cout << MyClass::getVar(&obj); <-- Error: no matching function std::cout << obj.getVar(); return 0; } 吗?

我问这之前找到的最接近的答案是*this。但是我尝试过这种方法,但仍然出现错误。我可以得到这些错误消息的解释吗?因为,如果编译器实际上将那些函数签名修改为包含this,那应该就可以了,不是吗?

c++ class object this member-functions
3个回答
1
投票

*this

此版本无法编译,因为未声明obj.getVar(&obj)成员函数采用任何参数。

getVar()

此版本使用语法访问MyClass::getVar(&obj)函数,但static不是getVar(),也不接受任何参数。

注: static调用之所以有效,是因为它指定使用哪个对象实例(即obj.getVar()部分)来执行成员函数,并且从概念上讲是成员函数传递[ C0]指针


0
投票

仅允许编译器执行此操作吗?

精确地。这就是为什么将其称为“隐藏”的原因:这是编译器代表您执行的操作,但是在使用它的C ++代码中是隐藏的。]

编译器必须以某种方式将obj.指针传递给成员函数,但是不需要告诉您它是如何执行的。它可能

将代码编译为与this等效的代码,并以与传递C函数this的参数相同的方式传递MyClass::getVar(&obj)指针。或者它可能使用与非成员参数传递完全不兼容的其他机制。它的功能由平台的抽象二进制接口标准(ABI)定义,该标准不是C ++语言标准的一部分。 Windows下发生的事情可能与Linux下发生的事情大不相同,ARM上的Linux可能与X86上的Linux有所不同,等等。

就是说,您可以通过告诉编译器生成汇编代码来查看实际发生的情况。对于this,咒语为

free(foo)

这将产生一个gcc文件,其中包含g++ -S -Os interestingCode.cpp 实际如何翻译您的代码。


0
投票

当您执行obj.getVar()

© www.soinside.com 2019 - 2024. All rights reserved.