class foo {
public:
foo() : foo_member1(1)
int foo_member1;
void do_something() {foo_member1++;}
}
int main(){
foo my_foo;
my_foo.do_something();
}
上面的示例代码中所有内容都存储在哪里?这是我开车回家时想到的事情,感到尴尬的是我无法确定答案。 我创建了一个在堆栈上都包含变量的对象。当我调用do_something并输入一个新的堆栈框架时,它如何访问作为my_foo对象一部分存储在上一个堆栈框架中的成员变量?它被复制了吗?在引用之下默默地经过?还是实际上最终会出现在堆上?还是有某种特殊的机制可以使代码访问堆栈中位于其之前的内容?
答案 0 :(得分:0)
此:
my_foo.do_something();
通过传递隐藏参数foo::do_something()
来调用方法this = &my_foo
。这只是一个普通的C函数,仅获取一个隐藏参数。 do_something
的代码并没有真正访问main
的堆栈帧,只是使用了this
传递的main
。
在do_something
内,代码被视为:
this->foo_member1++;
无跨框架访问。它只是指向存储位置的指针,恰好在main的框架中。在函数之间传递指针时没有内存保护。