位拷贝=浅拷贝 值拷贝=深拷贝
来源:互联网 发布:云天河姜云凡美工 编辑:程序博客网 时间:2024/05/17 07:11
首先定义String类,而并不实现其成员函数。
Class String
{
public:
String(const char *ch=NULL);//默认构造函数
String(const String &str);//拷贝构造函数
~String(void);
String &operator=(const String &str);//赋值函数
private:
char *m_data;
};
位拷贝拷贝的是地址,而值拷贝则拷贝的是内容。如果定义两个String对象A和B。A.m_data和B.m_data分别指向一段区域,A.m_data="windows",B.m_data=“linux";
如果未重写赋值函数,将B赋给A;则编译器会默认进行位拷贝,A.m_data=B.m_data
则A.m_data和B.m_data指向同一块区域,虽然A.m_data指向的内容会改变成"linux",但是这样容易出现这些问题:
(1):A.m_data原来指向的内存区域未释放,造成内存泄露。
(2):A.m_data和B.m_data指向同一块区域,任何一方改变都会影响另一方
(3):当对象被析构时,B.m_data被释放两次。
对于编译器,如果不主动编写拷贝函数和赋值函数,它会以“位拷贝”的方式自动生成缺省的函数。
如果重写赋值函数和拷贝构造函数后,
A.m_data=B.m_data,进行的是值拷贝,会将B.m_data的内容赋给 A.m_data,A.m_data还是指向原来的内存区域,但是其内容改变。
拷贝构造函数和赋值函数非常容易混淆,常导致错写、错用。拷贝构造函数是在对
象被创建时调用的,而赋值函数只能被已经存在了的对象调用。以下程序中,第三
个语句和第四个语句很相似,你分得清楚哪个调用了拷贝构造函数,哪个调用了赋
值函数吗?
String a(“hello”);
String b(“world”);
String c = a; // 调用了拷贝构造函数,最好写成 c(a);
c = b; // 调用了赋值函数
本例中第三个语句的风格较差,宜改写成String c(a) 以区别于第四个语句。
- 位拷贝=浅拷贝 值拷贝=深拷贝
- 浅拷贝、深拷贝、值拷贝和位拷贝
- 位拷贝、值拷贝、深拷贝、浅拷贝
- 位拷贝、值拷贝、深拷贝、浅拷贝
- 位拷贝、值拷贝、浅拷贝、深拷贝
- 拷贝构造、赋值构造、深拷贝、浅拷贝、位拷贝、值拷贝
- C++中的位拷贝和值拷贝(深拷贝和浅拷贝)
- C语言拾遗:位拷贝与值拷贝,浅拷贝与深拷贝
- C语言拾遗:位拷贝与值拷贝,浅拷贝与深拷贝
- 深拷贝&&浅拷贝
- 深拷贝||浅拷贝
- 浅拷贝,深拷贝
- 浅拷贝,深拷贝
- 深拷贝,浅拷贝
- 浅拷贝 深拷贝
- 浅拷贝.深拷贝
- 浅拷贝 深拷贝
- 深拷贝,浅拷贝
- 追MM与Java的23种设计模式
- hibernate3 Annotation中使用oracle seq生成主键值
- JavaScript方法和技巧大全
- Winform弹出新窗口,遮罩旧窗口
- ShellExecute的妙用
- 位拷贝=浅拷贝 值拷贝=深拷贝
- 如何学习wince驱动开发--转载(作者:gooogle man)
- 去掉Flex蓝色选中状态
- 深入浅出ShellExecute
- VC中控制只启一个程序实例的方法
- 一年总结与展望
- VCL窗口函数注册机制研究手记,兼与MFC比较
- 课件制作工具——wizBuilder CS
- 一次渗透测试的过程