拷贝构造函数和赋值的深入理解

来源:互联网 发布:ubuntu 无法启动虚拟机 编辑:程序博客网 时间:2024/05/22 06:18

1、什么是拷贝构造函数

拷贝构造函数分为两类:
一类是系统默认提供的拷贝构造函数,只是简单的把栈里面的数据进行拷贝,堆上面的内容没有进行拷贝;
二类是自己定义的拷贝构造函数,能够对堆上面的东西进行深度的拷贝;

2、什么情况下调用拷贝构造函数?

  • 对象声明的时候就初始化(赋值)

public class Student{private:char*name;int id;};

Student a;

Student b=a;//拷贝

  • 以值作为参数传递

void f(Student a)//调用这个函数的时候,会调用拷贝构造函数

  • 以值作为返回值传递

Student f(Student a){

return a;

}

3、浅拷贝和深拷贝的区别?




4、浅拷贝和深拷贝各有什么特点

浅拷贝对于在栈上面的数据进行拷贝是非常好的,而且效率也是非常高的。比如上面的b.id=a.id,这个就是在栈上面的拷贝,

对于在堆上面的拷贝就有点显得不足了,因为在一个对象的生面周期结束的时候,会调用析构函数,而我们会在析构函数里面释放内存(在堆上面分配的)

如果是浅拷贝,先释放a这个对象的时候,我们会把a.name所指的内存释放,此时b.name指的区域就是无效的,等析构b对象的时候,

我们释放b.name所指的内存就会报错,因为那块区域是无效的了,释放无效内存是会报错的。

深拷贝就会解决这个问题,因为a.name和b.name所指的内存是不同的。

拷贝构造函数的一般写法

Student::Student(const Student&student){int length=strlen(student.name)+1;this->name=new char[length+1];//这里就是深拷贝,先在堆上面分配内存,然后拷贝内容strcpy(this->name,student.name);}

5、什么是赋值操作

对象在申明之后,在进行的赋值运算,我们称之为赋值运算,比如说:

 Student a; Student b;//声明两个对象

a=b;//赋值操作

赋值操作的一般写法

Student& Student::operator=(const Student& student){if(this==&student){return *this;//遇到a=a这个种情况}if(this->name!=NULL){delete []name;//释放之前的在堆里面分配的内存}int length=strlen(student.name)+1;this->name=new char[length];strcpy(this->name,student.name);this->id=student.id;return *this;}

6、比较拷贝构造函数和赋值操作

1、传递参数的形式:都是用传引用的方式,(拷贝构造函数是用引用,详情请点击这里)

2、拷贝构造函数无须释放this->name的内存,这是因为当前对象还没有建立,而赋值操作要释放this->name的内存,那是因为这个对象已经存在于内存上面了。

3、由于调用赋值操作的时候,对象都是建立的了,所以在赋值的时候,我们就检验是否为自己赋值给自己,这样就避免浪费内存。

3、赋值操作返回的是引用,为什么不是值传递或者是指针传递(详情点击这里)

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 贴纸贴反了怎么办 汽车贴纸刚贴好就下雨怎么办 白条贷款逾期了怎么办 联通充值卡过期了怎么办 购物卡消磁了怎么办 ie浏览器报错怎么办 db2导入大数据怎么办 拼团人数不够怎么办 耳机线外皮破了怎么办 耳机罩掉皮了怎么办 耳机皮掉了怎么办 债券逆回购买入怎么办 京东保价 发票怎么办 win7用户已锁定怎么办 电脑账户被锁定怎么办 win7状态不可用怎么办 电脑的本地连接不见了怎么办 win7电脑没有本地连接怎么办 win7字体换不了怎么办 电脑没系统了怎么办 电脑系统没有了怎么办 系统调用区域小怎么办 win8.1网络受限怎么办 电脑连wifi受限怎么办 鼠标不好用了怎么办 手机指纹不好使怎么办 手机录像不好使怎么办 手机1个卡不好使怎么办 手机收藏不好使怎么办 window10连不上网怎么办 电脑没有家庭组怎么办 usb共享网络出错怎么办 电脑共享有密码怎么办 win10连不上网怎么办 w10网络重置了怎么办 点击网络重置后怎么办? 电脑启动找不到硬盘怎么办 电脑开机找不到硬盘怎么办 电脑找不到宽带连接怎么办 电脑文件找不到了怎么办 电脑找不到手机热点怎么办