【发布时间】:2020-04-06 13:55:38
【问题描述】:
在阅读*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,那么这应该可以工作,不是吗?
【问题讨论】:
-
getVar()不接受任何参数,因此这两个调用不起作用。从概念上讲,您已经通过使用obj.传递“this”,这是用于执行成员函数的实例。 -
请包含完整的错误消息(和无效代码)
-
@idclev463035818 非工作代码是注释掉的行。如果我将它们全部取消注释,则错误消息会很长,并且会显示多字符常量等内容。lol
-
this是一个关键字。你不能这样命名一个变量。但是您可以编写例如int getVar(MyClass* theOtherThis),它会起作用。您可以在getVar()中访问this和theOtherThis,两者都相等。问题是:你为什么要做这样的事情? -
@ArdentCoder 认为“隐藏参数”是一个实现细节。理论上,只要结果相同,编译器可以使用完全不同的技术。
标签: c++ class object this member-functions