[阅读*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,那应该就可以了,不是吗?
*this
此版本无法编译,因为未声明obj.getVar(&obj)
成员函数采用任何参数。
getVar()
此版本使用语法访问MyClass::getVar(&obj)
函数,但static
不是getVar()
,也不接受任何参数。
注: static
调用之所以有效,是因为它指定使用哪个对象实例(即obj.getVar()
部分)来执行成员函数,并且从概念上讲是成员函数传递[ C0]指针。
仅允许编译器执行此操作吗?
精确地。这就是为什么将其称为“隐藏”的原因:这是编译器代表您执行的操作,但是在使用它的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
实际如何翻译您的代码。
当您执行obj.getVar()