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

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

c++

8个回答

比如说
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函数,一个入口地址
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复Chanline: 每个线程拥有自己独立的堆栈,堆栈上存储着各自的参数和局部变量,所以,不访问静态成员/全局变量的时候。它们互相不会干扰的。
大约一年之前 回复
zhang87717
Chanline 那么A_foo(a)和函数A_foo(b)如果有同时执行的时候,两个线程同时执行这段代码,它们是如何保证输出的值是1和2而不相互冲突的呢?就是说两个线程可同时执行此同一个成员函数吗?
大约一年之前 回复

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

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

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

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

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

weixin_40839791
青松下 回复Chanline: 函数内部的本地变量是线程级别的,不同线程不会共用
大约一年之前 回复
zhang87717
Chanline 同一进程下,所有内存段都分配在一块连续的内存中,进程中的不同线程在执行他们相同的区域代码时,寻的是相同的地址,使用相同的数据。可能是线程在cpu执行时排队进行,时间先后进行分离的
大约一年之前 回复

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

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问