请问怎样理解:编译器将以“位拷贝”的方式自动生成缺省的函数。

benzite 2005-09-17 03:43:25
在林锐博士的《高质量C++编程指南》中有这样一句话,我琢磨了好长时间也没理解透:

如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数。倘若类中含有指针变量,那么这两个缺省的函数就隐含了错误。

主要是对“位拷贝”的概念不清楚,请高手多多指教,谢谢了。
...全文
128 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
benzite 2005-09-17
  • 打赏
  • 举报
回复
很好,太感谢了,高手们谢谢了。
husl 2005-09-17
  • 打赏
  • 举报
回复

其含义是对对象内的值类型变量进行赋值拷贝,对其内的引用类型变量进行句柄拷贝,也就是拷贝后的引用变量将持有对同一块内存的引用。 这一句很清楚了

它的例子也举的很好啊
husl 2005-09-17
  • 打赏
  • 举报
回复

错了错了 不好意思 位拷贝和值拷贝是相反的

"影子拷贝”仅仅是对象的一份按位拷贝,其含义是对对象内的值类型变量进行赋值拷贝,对其内的引用类型变量进行句柄拷贝,也就是拷贝后的引用变量将持有对同一块内存的引用。相对于“影子拷贝”的是深度拷贝,它对引用类型的变量进行的是值复制,而非句柄复制。例如X是一个含有对象A,B引用的对象,而对象A又含有对象M的引用。Y是X的一个“影子拷贝”。那么Y将拥有同样的A,B的引用。但对于X的一个“深度拷贝”Z来说,它将拥有对象C和D的引用,以及一个间接的对象N的引用,其中C是A的一份拷贝,D是B的一份拷贝,N是M的一份拷贝。

上面是关于C#的文档中找到的
"影子拷贝” 就是 浅拷贝 是通过 按位拷贝实现的
其中说的引用类型变量就是 指针变量吧



「已注销」 2005-09-17
  • 打赏
  • 举报
回复
同意楼上.
husl 2005-09-17
  • 打赏
  • 举报
回复

位拷贝 == 值拷贝
foochow 2005-09-17
  • 打赏
  • 举报
回复
看看effective c++上的..
拷贝构造函数和赋值运算符,官方的规则是:缺省拷贝构造函数(赋值运算符)对类的非静态数据成员进行 "以成员为单位的" 逐一拷贝构造(赋值)。即,如果m是类C中类型为T的非静态数据成员,并且C没有声明拷贝构造函数(赋值运算符),m将会通过类型T的拷贝构造函数(赋值运算符)被拷贝构造(赋值)---- 如果T有拷贝构造函数(赋值运算符)的话。如果没有,规则递归应用到m的数据成员,直至找到一个拷贝构造函数(赋值运算符)或固定类型(例如,int,double,指针,等)为止。默认情况下,固定类型的对象拷贝构造(赋值)时是从源对象到目标对象的 "逐位" 拷贝。对于从别的类继承而来的类来说,这条规则适用于继承层次结构中的每一层,所以,用户自定义的构造函数和赋值运算符无论在哪一层被声明,都会被调用。
....
当含有指针时,如果调用默认的拷贝拷贝构造函数(赋值运算符),这个时候进行的浅拷贝(赋值),会使2个指针指向同一个内存区域,析构的时候就会出现同一个内存资源被释放2次的错误..
sankt 2005-09-17
  • 打赏
  • 举报
回复
good
benlei999 2005-09-17
  • 打赏
  • 举报
回复
位拷贝就是说把对象的存储区域按位copy到新对象。
假如你要拷贝或赋值的对象里有一个指针指向一块buffer,位拷贝的结果是你的新对象里的指针指向一块源对象指向的buffer。这是危险的!
所以如果对象里有如指针,就得自己写这两个函数,以保证对象里的指针有意义

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧