我会用一个小代码来解释我的问题:
class C {
int a;
public:
func() {
a = 4;
};
};
int main() {
C obj1;
obj1.func();
return 0;
}
此处func()
方法尝试将a
(obj1
的数据成员)设置为值4. func()
如何访问a
?是因为func()
可以访问this*
的{{1}}吗?
如果这是真的,那么obj1
如何访问func()
?从this*
调用func()
时,它是否作为隐式参数传递给obj1.func()
?
如果它作为参数传递,那么main()
堆栈是否包含main()
存储为其局部变量?
如果不是,生成this*
指针的方式和时间以及存储位置在何处?
我试图根据我对该主题的理解逐步提出问题。如果一切都证明是真的,我很困惑是否在堆栈上静态生成的每个对象,额外的*存储在堆栈上。
请随时提出修改建议。
感谢。
答案 0 :(得分:3)
首先,让我回答你的问题。
这里func()方法尝试将(obj1的数据成员)设置为值 4. func()如何访问'a'?是因为func()可以访问obj1的这个*吗?
是的,你的假设是正确的。
如果这是真的,func()如何获得对此*的访问权限?是传递给 从main?
调用obj1.func()时,func()是一个隐式参数
我将在本回复中稍后介绍,但是是的。每个成员函数都传递一个self参数。 C ++编译器为您完成此任务。请注意,静态方法是一个例外。
如果它作为参数传递,main()堆栈是否包含此* 存储为其本地变量?如果不是,这个怎么样和什么时候* 生成的指针和存储在哪里?
看看以下示例。第一个是C语言,第二个是CPP。
struct A{
int i;
}
increment(A* a){
a->i +=1;
}
int main(){
A anA;
anA.i = 0;
increment(&anA);
}
现在,请查看cpp。
中的以下内容struct A{
int i;
public:
void increment(){
i+=1;
}
}
int main(){
A anA;
anA.increment();
}
上述例子在基本性质上是相同的。它们执行相同的任务并以相同的方式执行它(不包括构造函数/析构函数)。主要区别在于cpp编译器负责将指向模型的指针(结构A)传递给函数,在C中你需要自己传递它。
this*,
实际上只是指向你的struct的指针。因此,在上面的示例中,它指向anA
。
我建议用c ++阅读思考。它是免费的,其中一本书让我开始使用CPP。如果你想对语言有一个很好的理解,那就值得花时间。 here