同一类的不同对象,在调用同一成员函数时,是如何保证不冲突且各自输出各自想要的结果的?

同一类的不同对象,在调用同一成员函数时,是如何保证不冲突且各自输出各自想要的结果的?

问题描述:

对于一个类,其中有一个成员方法,比如class A{ fun(){...} };现此类有两个对象A a,b。成员函数同时被两个对角调用a.fun(), b.fun(),他们调用该函数的入口地址是一样的,如何保证不冲突,输出是各对象所要的结果的?

比如说
class A
{
private:
int x;
public:
void foo() { cout << x; }
};
C++编译器会编译成(注意,这是原理展示,不代表说编译器会先转换成下面的代码再编译)类似下面的C语言代码
struct A
{
int x;
};
void A__foo(A * this)
{
cout << this->x;
}
所以
 A a;
 a.x = 1;
 A b;
 b.x = 2;
 a.foo();
 其实就是
 A__foo(a); 
 所以肯定输出的是1而不是2
 而且很明显,我们只需要一个A__foo函数,一个入口地址

同一个类的对象使用不同的内存段,但静态成员共享相同的内存空间,只要不是静态成员函数,互相不会发生关系,也不存在冲突的问题。

一般成员函数的第一个参数默认是this(可以不写),this指针指向调用这个函数的对象,所以可以给函数传入不同的参数,输出不同的值,而且互不影响。
但是静态成员函数没有this指针,你可以在网上多查查。

在jvm(也就是java虚拟机)中有一个java 栈的概念,每个线程有且仅有一个java栈,每次方法调用jvm都会向当前的java栈中压入一个栈帧,使用这个帧来存数参数、局部变量、中间运算结果等等数据。方法退出的时候就出栈,弹出了,所有不同的对象拥有不同的数据栈,因此不会发生冲突,如果使用了同一片数据区域,会使用同步来解决冲突的问题。

对于java而言,函数内的变量是局部变量,不同对象处于不同线程中,不同线程执行同一函数是相互隔离的,c++也一样。

对C++而言,这种情况一般把函数设计成带参数,根据参数不同,处理不同的事情。或者重载这个函数

你定义的对象,编译器应该是分配了两个内存,内存之间数据是相互不影响的。你可以new出来指针查看变量地址。如果是打印的话,只能重载了或者用多态
图片说明

非常感谢大家,这是我今天的一个面试题,面试官开始问我:同一类的不同对象,在调用相同的成员函数时,他们的入口地址是否相同?一脸懵。然后他又说:我可以告诉你他们的入口地址是一样的,但什么样的机制来保证他们同时调用的时候不冲突,并且输出是各自的结果的?二脸懵。