我无法正确理解在创建类实例时以及在调用实例方法时究竟发生了什么。
例如,有一个c ++代码:
class A {
int a;
void print_my_a();
public:
A();
};
void A:: print_my_a() {
cout << a << '\n';
}
A::A(): a(10) {}
int main() {
A Aobj1 = A();
A Aobj2 = A();
Aobj1.print_my_a();
Aobj2.print_my_a();
return 0;
}
所以问题是:
每个Aobj1
和Aobj2
实例是否只引用一种print_my_a()
方法?或者他们都有自己的print_my_a()
?
答案 0 :(得分:1)
所有函数都是代码,C ++中的所有代码都是共享的。但是,它并没有什么区别,因为无论如何都无法修改代码。
但是,在每个方法,实例或静态的运行时期间创建的局部变量是每次调用,因此如果同时或不同时调用相同的方法两次,则每个方法都有自己的局部变量。
答案 1 :(得分:0)
您看到的只是可执行文件中数据和代码布局的抽象。函数在代码段中有一个副本,并在对象之间共享。
答案 2 :(得分:0)
该方法的代码只存在一次,但“this”-pointer“传递”到该方法将有所不同。
如果你按如下方式重写print_my_a,那就更清楚了:
void A::print_my_a() {
cout << this->a << '\n';
}
因此: Aobj1.print_my_a()将指针指向Aobj1 和Aobj2.print_my_a()将指针指向Aobj2。
答案 3 :(得分:0)
一个对象拥有它自己的数据成员实例。因此,int a
的两个实例都拥有Aobj1
的单独实例。 Aobj2
。这些方法不归对象所有,但它们使用对象的状态(对象的数据成员实例)进行调用。