社区
数据结构与算法
帖子详情
每个对象中都有成员函数的一个拷贝吗?
SmallBoat2000
2009-12-10 11:03:55
比如一个类:
class A{
int n;
void fun();
}
A a;
对象a中含有(int n)的一份拷贝,而fun()函数是A的所有对象共有的吗?还是单独有一份拷贝的?
...全文
465
14
打赏
收藏
每个对象中都有成员函数的一个拷贝吗?
比如一个类: class A{ int n; void fun(); } A a; 对象a中含有(int n)的一份拷贝,而fun()函数是A的所有对象共有的吗?还是单独有一份拷贝的?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
gelu1040
2009-12-15
打赏
举报
回复
两个地方兵法运行同一个函数,这个函数内部的变量和形参都是独立的,所以没问题.
只是,函数参数是引用或者指针传入的时候,如果引用的地方一样,或者指针指的是同一块内存,才会有冲突.
另外,如果函数体内有静态变量,也要小心冲突(用词是小心,不是一定),不过有时就是利用这个特性进行两个实例的对话
keeya0416
2009-12-11
打赏
举报
回复
1
成员变量是每个对象有一个,方法是所有的对象共用一个.
gamedragon
2009-12-11
打赏
举报
回复
[Quote=引用 11 楼 dolphin_001 的回复:]
你误解他的意思了,他的意思是每次调用都要重新压栈,确实如此,只要用到局部变量,函数参数,都会分配最新的栈空间给这些变量,而不管你调用的到底是哪一个函数
[/Quote]
每个线程都有自己的栈,线程建立的时候栈就分配好了,函数调用的时候参数和局部变量无所谓分不分配的问题,只是移动一下栈指针而已,函数的代码只是根据栈指针取数据。A线程调用printf和B线程调用printf,要打印的东西完全不同,哪有“拷贝”的概念。
SmallBoat2000
2009-12-10
打赏
举报
回复
[Quote=引用 4 楼 gamedragon 的回复:]
同时使用一个函数怎么可能有冲突问题(如果函数是线程无关的)?LZ仔细考虑一下程序的执行过程就知道了。
如果有冲突,那么多程序同时用Windows API,Windows不是要冲突死了。
[/Quote]
忘了说,是多核情况下使用多线程?那情况会怎样呢?会不会发生冲突或者效率低下啊?
gamedragon
2009-12-10
打赏
举报
回复
同时使用一个函数怎么可能有冲突问题(如果函数是线程无关的)?LZ仔细考虑一下程序的执行过程就知道了。
如果有冲突,那么多程序同时用Windows API,Windows不是要冲突死了。
Dolphin_001
2009-12-10
打赏
举报
回复
[Quote=引用 9 楼 gamedragon 的回复:]
引用 7 楼 smallboat2000 的回复:
我暂时的理解是函数是用栈实现的,虽然类中的函数是共用的,但是每次调用函数都要压栈,并不是在原来的函数存储空间执行的,所以也就相对于每调用一次都拷贝了一份。不知这样理解对不?
不对。
函数只是一段代码在CPU上执行,用到的数据(函数的参数和局部变量)都在栈里,不同的线程有不同的栈,虽然使用的是同一个函数,但是函数所操作的数据是完全不同的数据。代码和数据没有绑定的关系,跟多少个核也没有关系,不知道你为什么会有“拷贝”这种想法。
[/Quote]
你误解他的意思了,他的意思是每次调用都要重新压栈,确实如此,只要用到局部变量,函数参数,都会分配最新的栈空间给这些变量,而不管你调用的到底是哪一个函数
SmallBoat2000
2009-12-10
打赏
举报
回复
如果是共用的,多线程编程的时候,多个对象都同时使用一个函数,会不会发生冲突或者效率低下啊?
阿杰心路历程
2009-12-10
打赏
举报
回复
在fun()方法里a还是用全局的a 单独的,没拷贝。
gamedragon
2009-12-10
打赏
举报
回复
当然是公用的。
成员函数和普通函数不同的地方就在于一个隐式的this指针。
gamedragon
2009-12-10
打赏
举报
回复
举个不恰当的例子,国家制定了法律,大家都要遵守法律,法律约束每一个人,那是不是说每个人都有个法律的拷贝呢?
gamedragon
2009-12-10
打赏
举报
回复
[Quote=引用 7 楼 smallboat2000 的回复:]
我暂时的理解是函数是用栈实现的,虽然类中的函数是共用的,但是每次调用函数都要压栈,并不是在原来的函数存储空间执行的,所以也就相对于每调用一次都拷贝了一份。不知这样理解对不?
[/Quote]
不对。
函数只是一段代码在CPU上执行,用到的数据(函数的参数和局部变量)都在栈里,不同的线程有不同的栈,虽然使用的是同一个函数,但是函数所操作的数据是完全不同的数据。代码和数据没有绑定的关系,跟多少个核也没有关系,不知道你为什么会有“拷贝”这种想法。
gamedragon
2009-12-10
打赏
举报
回复
[Quote=引用 5 楼 smallboat2000 的回复:]
忘了说,是多核情况下使用多线程?那情况会怎样呢?会不会发生冲突或者效率低下啊?
[/Quote]
Windows一样用得到多核。
SmallBoat2000
2009-12-10
打赏
举报
回复
我暂时的理解是函数是用栈实现的,虽然类中的函数是共用的,但是每次调用函数都要压栈,并不是在原来的函数存储空间执行的,所以也就相对于每调用一次都拷贝了一份。不知这样理解对不?
Dolphin_001
2009-12-10
打赏
举报
回复
成员函数都是放在静态存储空间里的。只有虚函数比较特别,会有一个虚函数表来指向所有的虚函数。
使用多线程,对于同一类的不同对象,调用同一个方法,局部变量是无关痛痒的,类成员变量是放在对象里面的,所以他并不会影响到多线程的共享变量,多核也不会影响了。
C++类的
拷贝
控制成员(
拷贝
构造、
拷贝
赋值、移动构造、移动赋值和析构函数)
类
中
定义了五种特殊的
成员函数
来控制
对象
的
拷贝
、移动、赋值和销毁操作,包括
拷贝
构造函数、
拷贝
赋值运算符、移动构造函数、移动赋值运算符和析构函数,统称为
拷贝
控制操作。
拷贝
构造函数和移动构造函数定义了 当用同类型的另
一个
对象
初始化正在创建的
对象
时需要做什么;
拷贝
赋值运算符和移动赋值运算符定义了 将
一个
对象
赋给另
一个
同类型的
对象
时需要做什么; 析构函数定义了 当类
对象
销毁时需要做什么。
拷贝
构造函数
拷贝
构造函数的第
一个
形参必须是自身类类型的引用,且任何其他参数都有默认值。
拷贝
构造函数的第
一个
形参必须是引用类
何时需要重写
拷贝
构造函数?为什么?
如果
一个
类包含动态分配的内存(例如,通过new关键字在堆上分配的内存),那么默认的
拷贝
构造函数只会复制指针,而不是实际的数据。在实现时,需要确保正确地复制源
对象
的所有成员,特别是当
对象
包含动态分配的内存、资源句柄或其他需要特殊处理的成员时。:是构造函数的一种特殊形式,用于根据已存在的
对象
(源
对象
)创建新的
对象
(目标
对象
),并将源
对象
的值复制到目标
对象
中
。
中
,
拷贝
构造函数是
一个
特殊的构造函数,用于从
一个
已存在的
对象
(即源
对象
)创建
一个
新的
对象
(即目标
对象
),并将源
对象
的值复制到目标
对象
中
。
拷贝
构造函数
我们知道,在C++
中
每
一个
类都有
一个
默认的构造函数,析构函数和
拷贝
构造函数。 对于两个
对象
p1,p2,实现语句p2 = p1就相当于在调用默认的
拷贝
构造函数,把p1
对象
的
每个
属性值逐个复制给
对象
p2的
每个
属性。所以
拷贝
构造函数主要用于
对象
之间的相互赋值。 当然,对于
拷贝
构造函数我们可以自定义,一般形式如下: class_name(const class_name &obje
「C++ 类和
对象
篇 4」空类和6个默认
成员函数
一、空类 二、6个默认
成员函数
三、 构造函数 四、析构函数 五、
拷贝
构造函数 六、赋值运算符重载函数 七、取地址运算符重载 八、默认
成员函数
什么情况需要显示去写?
Effective C++(12) 复制
对象
时要复制每
一个
成员
问题聚焦: 负责
拷贝
的两个操作:
拷贝
构造函数和重载赋值操作符。 一句话总结,确保被
拷贝
对象
的所有成员变量都做一份
拷贝
。
数据结构与算法
33,028
社区成员
35,337
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章