类方法访问它的数据成员

时间:2015-02-21 06:16:34

标签: c++ class memory stack this

我会用一个小代码来解释我的问题:

class C {
    int a;
public:
    func() {
        a = 4;
    };
};

int main() {
    C obj1;
    obj1.func();
    return 0;
}  

此处func()方法尝试将aobj1的数据成员)设置为值4. func()如何访问a ?是因为func()可以访问this*的{​​{1}}吗? 如果这是真的,那么obj1如何访问func()?从this*调用func()时,它是否作为隐式参数传递给obj1.func()? 如果它作为参数传递,那么main()堆栈是否包含main()存储为其局部变量?
如果不是,生成this*指针的方式和时间以及存储位置在何处?

我试图根据我对该主题的理解逐步提出问题。如果一切都证明是真的,我很困惑是否在堆栈上静态生成的每个对象,额外的*存储在堆栈上。

请随时提出修改建议。

感谢。

1 个答案:

答案 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