拷贝构造函数、赋值运算符、构造函数的区别及关系?
来源:互联网 发布:应聘数据分析师面试题 编辑:程序博客网 时间:2024/06/05 00:27
1、为什么要有拷贝构造函数,它跟构造函数有什么区别?
答:拷贝构造函数其实也是构造函数,只不过它的参数是const的类自身的对象的引用。如果类里面没有指针成员(该指针成员指向动态申请的空间),是没有必要编写拷贝构造函数的。我们知道,如果有一个类CObj,它已经产生了一个对象ObjA,现在又用CObj去创建ObjB,如果程序中使用语句ObjB = ObjA;也就是说直接使用ObjA的数据给ObjB赋值。这对于一般的类,没有任何问题,但是如果CObj里面有个char* pStr的成员,用来存放动态申请的字符串的地址,在ObjA中使用new方法动态申请了内存并让ObjA.pStr指向该申请的空间,在OjbB = OjbA之后,ObjA.pStr和ObjB.pStr将同时指向那片空间,这样到导致了谁也不知道到底该由谁来负责释放那块空间,很有可能导致同一块内存被释放两次。使用拷贝构造函数,先申请ObjA.pStr所指向的空间大小的空间,然后将空间内容拷贝过来,这样就不会同时指向同一块内存,各自有各自申请的内存,各自负责释放各自申请的内存,从而解决了刚才的问题。所以这里的“拷贝”拷贝的是动态申请的空间的内容,而不是类本身的数据。另外注意到,拷贝构造函数的参数是对象的引用,而不是对象的指针。至于为什么要用引用,不能够用指针暂时还没有搞明白,等搞明白了再说。
2、为什么要对=赋值操作符进行重载?
答:接上面的例子,用户在使用语句ObjB = ObjA的时候,或许ObjB的pStr已经指向了动态申请的空间,如果直接简单将其指向的地址覆盖,就会导致内存泄露,所以需要对=赋值操作符进行重载,在重载函数中判断pStr如果已经指向了动态申请的空间,就先将其释放。
3、拷贝构造函数和赋值操作符重载(=)的关系。
答:从原文的例子中可以看出,=赋值操作符重载比拷贝构造函数做得要多,它除了完成拷贝构造函数所完成的拷贝动态申请的内存的数据之外,还释放了原本自己申请的内存空间。所以原文最后给出的拷贝构造函数的实现可以使用=赋值操作符的重载来完成。
4、拷贝构造函数何时被调用?
a.对象的直接赋值也会调用拷贝构造函数,即一个对象需要通过另外一个对象进行初始化,(既然有了=赋值操作符重载,为什么还要调用拷贝构造函数?);
b.函数参数传递只要是按值传递也调用拷贝构造函数-¬—即一个对象以值传递的方式传入函数体
c.函数返回只要是按值返回也调用拷贝构造函数—-即一个对象以值传递的方式从函数体返回。
- 拷贝构造函数、赋值运算符、构造函数的区别及关系?
- 重载赋值运算符与拷贝构造函数的区别
- 拷贝构造函数与赋值运算符重载的区别
- 拷贝构造函数与赋值运算符的区别
- 使用拷贝构造函数和赋值运算符的区别
- 拷贝构造函数与赋值运算符重载的区别
- 重载赋值运算符与拷贝构造函数的区别
- 重载赋值运算符与拷贝构造函数的区别
- 拷贝构造函数与赋值运算符重载的区别
- 默认构造函数,拷贝构造函数,拷贝赋值运算符
- 构造函数,拷贝构造和赋值运算符‘=‘的区别
- 拷贝构造函数及赋值运算的问题
- 拷贝构造函数和赋值运算符 区别
- 拷贝构造函数和赋值运算符区别
- 拷贝构造函数和赋值运算符区别
- 拷贝构造函数和赋值运算符 区别
- 拷贝构造函数和赋值运算符区别
- 拷贝构造函数和赋值运算符 区别
- jsp中的搜索条件回显
- Java中方法多态以及多接口实现
- PHP 数据库mysql(一)
- vim查找或删除部分重复的行
- 优化MySchool SQL编程 第三章
- 拷贝构造函数、赋值运算符、构造函数的区别及关系?
- 使用xshell来操作服务器
- 在JS原型prototype中编写提取整数和移除字符串首尾空白的trim方法
- CentOS7 从零开始搭建 Hadoop2.7集群
- jQuery基础入门(一)
- 呃呃
- 214. Shortest Palindrome
- 深入理解C#:编程技巧总结(一)
- js中关于事件处理函数名后面是否带括号的问题