C++ 在C+中显式传递*this+;

C++ 在C+中显式传递*this+;,c++,class,object,this,member-functions,C++,Class,Object,This,Member Functions,在阅读有关的文章时,我看到: 当为对象调用非静态成员函数时,编译器 将对象的地址作为隐藏参数传递给函数 然后我试着: #include <iostream> class MyClass { int myVar; public: MyClass(const int& val) : myVar{val} {} // int getVar(MyClass* this) <-- Error: expected ',' or '...' before '

在阅读有关的文章时,我看到:

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

然后我试着:

#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;
}

#包括
类MyClass
{
int-myVar;
公众:
MyClass(const int&val):myVar{val}{}
//int getVar(MyClass*this)myVar;
}
};
int main()
{
MyClass obj(22);
//std::cout
obj.getVar(&obj)

此版本无法编译,因为
getVar()
成员函数未声明为接受任何参数

MyClass::getVar(&obj)

此版本使用语法访问
静态
函数,但
getVar()
不是
静态
,也不接受任何参数

注意:调用
obj.getVar()
之所以有效,是因为它指定了要使用哪个对象实例(即
obj.
部分)来执行成员函数,并且在概念上是如何将成员函数传递给
指针的

是否只允许编译器执行此操作

这就是为什么它被称为隐藏:它是编译器为你做的事情,但是它是从使用它的C++代码中隐藏的。 编译器必须以某种方式将
this
指针传递给成员函数,但它不需要告诉您它是如何完成的。它可以
MyClass::getVar(&obj)将代码编译为等价的
,以与传递C函数的参数
free(foo)
相同的方式传递
指针。或者,它可能使用与非成员参数传递完全不兼容的另一种机制。它在后台的作用由平台的抽象二进制接口标准(ABI)定义在C++语言标准中不存在。在Windows下发生的事情可能与Linux下发生的情况大不相同,而Linux上的ARM可能与X86上的Linux等不同。 也就是说,您可以通过告诉编译器生成汇编代码来了解实际发生的情况

g++ -S -Os interestingCode.cpp

这将生成一个
.s
文件,其中包含
g++
实际翻译代码的方式。

当您执行obj.getVar()时已经明确地指定了指针*>强>此=和Obj隐式传递给GETVAR。它不被隐藏。它是明确地传递函数的左边。可以使用Obj.GETVAR()或pTROBJ-> GETVAR(),但是在C++中不允许使用这样的构造GETVAR(TITPTR)。.Hidden表示单词this没有声明,但是您可以在函数内部使用。

getVar()
不接受任何参数,因此这两个调用不起作用。从概念上讲,您已经在传递“this”通过使用执行成员函数的实例
obj.
。请包含完整的错误消息(以及非工作代码)@idclev463035818非工作代码是注释掉的行。如果我将所有行一起取消注释,则错误消息相当长,并显示多字符常量等。lol
this
是一个关键字。您不能这样命名变量。但您可以编写例如
int getVar(MyClass*theOtherThis)
它会起作用。你可以在
getVar()
中访问
这个
另一个
,两者都是相等的。问题是:你为什么要这样做?@ArdentCoder“隐藏参数”是一个实现细节。理论上,编译器可以使用完全不同的技术,只要结果相同。但是编译器会自动放置一个
*这个
,那么,函数调用不匹配怎么会发生呢?如果这很幼稚,我很抱歉。@ArdentCoder这是不匹配的,因为你没有提供一个函数签名,因此该函数不存在。是的,我知道,但我认为编译器正在为我生成该函数签名:P