关于复制构造函数赋值函数
来源:互联网 发布:北京用友软件代理商 编辑:程序博客网 时间:2024/06/15 00:56
一、复制构造函数
1、 可以用类对象初始化另一个对象,默认是通过依次复制每个非静态数据成员来实现的,也可以通过提供特殊的复制构造函数(copy constructor )来改变默认行为。复制构造函数是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构造及初始化。
如果在类中没有显式的声明一个复制构造函数,那么,编译器会私下里制定一个函数来进行对象之间的位复制(bitwise copy)。这个隐含的复制构造函数简单地关联了所有的类成员。
在C++中,3中对象需要复制,在以下过程中,复制构造函数将被调用。
(1)一个对象以值传递的方式传入函数体。
(2)一个对象以值传递的方式从函数返回。
(3)一个对象需要通过另外一个对象进行初始化。
如下面代码:
#include<iostream>using namespace std;class Copy{public:int a;Copy(int x){a=x;}Copy(Copy ©)//复制构造函数{cout<<"copy constuctor!"<<endl;a=copy.a;}};void fun1(Copy copy)//(1) 值传递传入函数体{cout<<"fun1(Copy )"<<endl;}Copy fun2()// (2)值传递从函数体返回{Copy c(3);cout<<"fun2()"<<endl;return c;}int main(){Copy c1(5);Copy c2=c1;//用c1对c2进行初始化cout<<"first fun1()..."<<endl;fun1(c1);Copy c3=fun2();cout<<"second fun2()..."<<endl;return 0;}输出结果:
2、深复制和浅复制
深复制:为新对象制作了外部对象的独立复制;
浅复制:是让新旧两个对象指向同一个外部内容。
3、复制构造函数的理解
如果用户没有定义复制构造函数,并在代码中使用到了复制构造函数,编译器就会生成默认的复制构造函数;但是如果用户定义了复制构造函数,编译器就不会再生成复制构造函数了。
如果用户定义了一个构造函数,但不是复制构造函数,而此时在代码中又使用到了复制构造函数,编译器也还会生成默认的复制构造函数。
二、 赋值函数
当一个类对象向该类的另一个对象的赋值操作时,需要用到该类的赋值函数
三 、复制构造函数与赋值函数的区别:
1、复制构造函数是一个对象初始化一块区域,这块内存就是新对象的内存区;例如:
class A;A a;A b=a;//调用复制构造函数A b(a);//调用复制构造函数而赋值函数是对于一个已经被初始化的对象来进行赋值操作;例如:
class A;A a;A b;b=a; //调用赋值函数2、一般来说在数据成员包含指针对象时,应考虑两种不同的处理需求:一种是复制指针对象,另一种是引用指针对象。复制构造函数大多是情况下是复制,赋值函数是引用对象。
3、实现上不一样。复制构造函数首先是一个构造函数,它调用的时候是通过参数的对象初始化产生一个对象。赋值函数则是把一个新对象赋值给一个原有对象,所以如果原来的对象中又内存分配要先把内存释放掉,而且还要检查一下两个对象是不是同一个对象,如果是,则不作任何操作。
- 关于复制构造函数赋值函数
- 复制构造函数与赋值构造函数
- 复制构造函数与赋值构造函数
- 复制构造函数和赋值构造函数
- 赋值构造函数复制构造函数
- 复制构造函数和赋值构造函数
- 复制构造函数和赋值构造函数
- c++构造函数/复制构造/赋值函数
- 复制构造函数和赋值构造函数
- 关于拷贝构造函数,类的赋值与复制
- 关于默认构造函数、复制构造函数、析构函数、赋值操作的各种测试探索
- 关于复制构造函数
- 关于复制构造函数
- 关于复制构造函数
- 关于复制构造函数
- 关于复制构造函数
- 赋值函数和复制构造函数
- 复制构造函数 与 赋值操作函数
- IAR无法跳转问题解决
- Requests
- Django资源大全
- POJ1741 [Tree] 点分治
- Android应用组件之Activity介绍1
- 关于复制构造函数赋值函数
- Selenium
- 数据结构-栈
- 79. Word Search
- 静态链接库和动态链接库的区别及优缺点
- Arduino智能小车——拼装篇
- Servlet之forward、sendRedirect、 include区别与使用
- Struts中继承接口SessionAware来实现session中的map集合
- 慕课笔记--[课程]Less即学即问