【问题标题】:Class method access to it's data members类方法访问它的数据成员
【发布时间】:2015-04-22 22:45:13
【问题描述】:

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

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

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

这里func() 方法尝试将aobj1 的数据成员)设置为值4。func() 如何访问a?是因为func() 可以访问this* 以获得obj1
如果这是真的,func() 如何访问this*?从main() 调用obj1.func() 时,它是否作为隐式参数传递给func()
如果它作为参数传递,main() 堆栈是否由存储为局部变量的this* 组成?
如果否,this* 指针是如何以及何时生成的,它存储在哪里?

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

请随时提出修改建议。

谢谢。

【问题讨论】:

标签: c++ class memory stack this


【解决方案1】:

首先,让我回答你的问题。

这里 func() 方法尝试将 a(obj1 的数据成员) 设置为 4. func() 如何访问'a'?是因为 func() 可以访问 obj1 的 this* 吗?

是的,你的假设是正确的。

如果是这样,func() 是如何访问 this* 的?是否传递给 从 main 调用 obj1.func() 时将 func() 作为隐式参数?

稍后我将在此回复中详细介绍这一点,但是是的。每个成员函数都传递了一个 self 的参数。 C++ 编译器会为您执行此操作。请注意,静态方法是一个例外。

如果它作为参数传递,main() 堆栈是否包含 this* 存储为其局部变量?如果不是,这个是如何以及何时发生的* 生成的指针,存放在哪里?

看看下面的例子。第一个在 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*, 实际上只是指向您的结构的指针。所以在上面的例子中它是一个指向anA的指针。

我建议阅读 C++ 中的思想。它是免费的,也是让我开始接触 CPP 的一本书。如果您想对该语言有一个很好的理解,那么值得花时间。 here.

【讨论】:

  • 关于您的第一条评论“是的,所有成员函数都可以访问类变量。”。由于“this*”,该陈述成立。如果指针没有被隐式传递给函数,就不会有任何东西将函数和类变量绑定在一起。正确的?总的来说,你的回答消除了我的疑惑。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 2016-05-18
相关资源
最近更新 更多