C++对象的赋值和复制
时间:2022-04-26
本文章向大家介绍C++对象的赋值和复制,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文属于上篇博文《C++区别于其他语言的知识点总结》第13小节。
13.对象的赋值和复制
对象的赋值:C++中对象可以使用”=”进行赋值,通过重载”=”号运算符实现,实际上这个过程是通过成员赋值(mewberwise copy)实现的,即将一个对象的成员一一赋值给另一对象的对应成员。注意:对象的赋值只是对其中数据成员的赋值,而不是对成员函数赋值。 对象1 = 对象2;//浅拷贝 浅复制
Box *b1 = new Box(1, 2, 3); //C++类Java对象声明 必须使用指针
Box *b2;
b1 = b2; //浅拷贝
delete b1;
delete b2;//同一块地址 删了2次
Box b1 = Box(1, 2, 3);
Box b2;
b2 = b1;//位复制方式给b2赋值 想当于b1的内存完全copy给b1
//当这里给b2赋值时,回到时b2的p指针和b1的p指针指向同一个地方 即b1的p
//当程序运行结束时,会导致同一个内存在各自的析构函数中释放,累计释放了2次。
//深拷贝 深复制
补充:深拷贝和浅拷贝的区别: https://www.zhihu.com/question/36370072
对象的复制:用一个已有的对象快速地多个完全相同的对象。 //对象赋值:两个对象都已经存在,然后用一个对象给另一个对赋值 //对象复制:已经有一个对象,再创建另一个对象时,用已知的对象初始化创建对象
对象复制的一种形式:
Box box2(box1);//类名 对象2(对象1);
//用对象1复制出对象2 建立对象时调用了一个特殊的构造函数——copy构造函数(copy constructor)
//the copy constructor definition 详见课本101页
Box :: Box(const Box&b) {
height = b.height;
width = b.width;
length = b.length;
}
对象复制的另一种形式:
Box box2 = box1;//类名 对象1 = 对象2;
两者区别: 对象的赋值是对一个已经存在的对象赋值,因此必须先定义被赋值的对象,才能进行对象的赋值。而对象的复制则是从无到有地建立一个新对象,并使它与一个已有的对象的完全相同(包括对象的结构和成员的值)。
c3 = c1.complex_add(c2);//此处存在对象的赋值和复制问题
//对象的复制,存在于实参到形参以及函数的返回中
//实现机制实例
//重载=号实现对象赋值
Person& operator= (Person &s) {
puts("oper");
if(this == &s) return s;
char *t = new char[srelen(s.p) + 1];
strcpy(t, s.p);
delete []p;
p = t;
return this*;
}
//Copy构造函数实现对象复制
Person (const Person& s) {
puts("cp cntr");
p = new char[strlen(s.p) + 1];
strcpy(p, s.p);
}
- shell获取每月最后一天
- 定向转发和重定向实现 <select >下拉表单数据传送
- Python:获取某月第一天和最后一天
- hdu 3635 Dragon Balls (带权并查集)
- 沃趣QFusion vs MGR、MGC面面观
- Redis的配置、启动、操作及关闭
- 剖析Go编写的Socket服务器模块解耦及基础模块的设计
- hdu 3172 Virtual Friends (映射并查集)
- Vue 大法好
- Python:ip地址处理模块
- Oracle 12c系列(四)|资源隔离之IO、内存、CPU
- Python:gethostbyname获取本地ip地址
- Oracle 12c系列(五)|PDB Refresh
- hdu 2473 Junk-Mail Filter (并查集之点的删除)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 交换机与VLAN:以办公室为例趣讲一波!
- 超详细Netty入门,看这篇就够了!
- Netty进阶之粘包和拆包问题
- 用侦察兵的故事趣讲ICMP和Ping,看完想忘都难!
- Kubernetes 使用 ceph-csi 消费 RBD 作为持久化存储
- ZooKeeper入门,看这篇就够了
- 超详细的RabbitMQ入门
- 用向量做Mantel的几个问题
- Eclipse集成Maven打包时报错:[ERROR] Unknown lifecycle phase "mvn". You must specify a valid lifecycle phase
- Windows下使用Nginx+Tomcat做负载均衡
- CTO 写的代码,真是绝了
- 网站克隆:setoolkit社工软件
- 什么是数据驱动测试?学习创建框架
- 自动化面试题,我用来面试成功了
- MySQL中的InnoDB是怎么解决幻读的?