社区
C++ 语言
帖子详情
请问怎样理解:编译器将以“位拷贝”的方式自动生成缺省的函数。
benzite
2005-09-17 03:43:25
在林锐博士的《高质量C++编程指南》中有这样一句话,我琢磨了好长时间也没理解透:
如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数。倘若类中含有指针变量,那么这两个缺省的函数就隐含了错误。
主要是对“位拷贝”的概念不清楚,请高手多多指教,谢谢了。
...全文
128
8
打赏
收藏
请问怎样理解:编译器将以“位拷贝”的方式自动生成缺省的函数。
在林锐博士的《高质量C++编程指南》中有这样一句话,我琢磨了好长时间也没理解透: 如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数。倘若类中含有指针变量,那么这两个缺省的函数就隐含了错误。 主要是对“位拷贝”的概念不清楚,请高手多多指教,谢谢了。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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。这是危险的!
所以如果对象里有如指针,就得自己写这两个函数,以保证对象里的指针有意义
C++复制(
拷贝
)构造
函数
实验代码
C++复制(
拷贝
) 构造
函数
实验代码 每个类只有一个析构
函数
和一个赋值
函数
,但可以有多个构造
函数
(包含一个
拷贝
构造
函数
,其它的称为普通构造
函数
)。对于任意一个类 A ,如果不想编写上述
函数
, C++
编译器
将自动为 A 产生四个
缺省
的
函数
(也只是在需要的时候才会产生)
C++
编译器
将自动为类产生四个
缺省
的
函数
构造
函数
、析构
函数
与赋值
函数
是每个类最基本的
函数
。它们太普通以致让人容易麻痹大意, 其实这些貌似简单的
函数
就象没有顶盖的下水道那样危险。 每个类只有一个析构
函数
和一个赋值
函数
,但可以有多个构造
函数
(包含一个
拷贝
构造
函数
,其它的称为普通构造
函数
)。对于任意一个类A,如果不想编写上述
函数
,C++
编译器
将自动为A 产生四个
缺省
的
函数
,例如: A(void); //
缺省
的无参数构造
函数
A(cons...
当C++定义类时,
编译器
会为类
自动生成
哪些
函数
?这些
函数
各自都有什么特点?
简要:对于一个空类,C++
编译器
默认生成四个成员
函数
:默认构造
函数
、析构
函数
、
拷贝
(复制)构造
函数
、赋值
函数
目录 一、默认构造
函数
二、析构
函数
三、
拷贝
(复制)构造
函数
四、赋值
函数
一、默认构造
函数
默认构造
函数
(default constructor)就是在没有显式提供初始化式时调用的构造
函数
。它由不带参数的构造
函数
,或者为所有的形参提供默认实参的构造函...
C++的6个
缺省
函数
一.在C++中默认产生6个类成员
函数
,即
缺省
函数
,它们分别是: 1.
缺省
构造
函数
2.
缺省
拷贝
构造
函数
3.
缺省
析构
函数
4.
缺省
赋值运算符 5.
缺省
取址运算符 6.
缺省
取地址运算符 二,const对于空类,
编译器
不会生成任何的成员
函数
,只会生成1个字节的占
位
符。有时可能会以为
编译器
会为空类生成默认构造
函数
等,事实上是不会的,
编译器
只会在需要的时候生成6个成员
函数
:一个
缺省
的构造
函数
、一个
拷贝
构造
函数
、一个析构
函数
、一个赋值运算符、一对取址运算符和一个this指针。 1.构造
函数
定义及调用 1) c++中的
关于
编译器
生成默认构造
函数
的
理解
构造
函数
默认构造
函数
无参的构造
函数
、全
缺省
构造
函数
、我们没写
编译器
默认生成的构造
函数
,都可以称之为默认构造
函数
; 默认构造
函数
只能有一个 1、如何
理解
“ 如果用户不显示定义构造
函数
,
编译器
会生成默认构造
函数
” ? 例1:不显式定义构造
函数
class Date { private: int _year; int _month; int _day; }; int main() { Date d; system("pause"); return 0; } 从监视窗口可以看到
C++ 语言
64,683
社区成员
250,490
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章