前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C++对象的赋值和复制

C++对象的赋值和复制

作者头像
Steve Wang
发布于 2018-02-05 09:32:35
发布于 2018-02-05 09:32:35
3.2K00
代码可运行
举报
文章被收录于专栏:从流域到海域从流域到海域
运行总次数:0
代码可运行

本文属于上篇博文《C++区别于其他语言的知识点总结》第13小节。

13.对象的赋值和复制

对象的赋值:C++中对象可以使用”=”进行赋值,通过重载”=”号运算符实现,实际上这个过程是通过成员赋值(mewberwise copy)实现的,即将一个对象的成员一一赋值给另一对象的对应成员。注意:对象的赋值只是对其中数据成员的赋值,而不是对成员函数赋值。 对象1 = 对象2;//浅拷贝 浅复制

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Box *b1 = new Box(1, 2, 3); //C++类Java对象声明 必须使用指针
Box *b2;
b1 = b2; //浅拷贝
delete b1;
delete b2;//同一块地址 删了2次

Box b1 = Box(123);
Box b2;
b2 = b1;//位复制方式给b2赋值 想当于b1的内存完全copy给b1
//当这里给b2赋值时,回到时b2的p指针和b1的p指针指向同一个地方 即b1的p
//当程序运行结束时,会导致同一个内存在各自的析构函数中释放,累计释放了2次。

//深拷贝 深复制

补充:深拷贝和浅拷贝的区别: https://www.zhihu.com/question/36370072

对象的复制:用一个已有的对象快速地多个完全相同的对象。 //对象赋值:两个对象都已经存在,然后用一个对象给另一个对赋值 //对象复制:已经有一个对象,再创建另一个对象时,用已知的对象初始化创建对象

对象复制的一种形式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
}

对象复制的另一种形式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Box box2 = box1;//类名 对象1 = 对象2;

两者区别: 对象的赋值是对一个已经存在的对象赋值,因此必须先定义被赋值的对象,才能进行对象的赋值。而对象的复制则是从无到有地建立一个新对象,并使它与一个已有的对象的完全相同(包括对象的结构和成员的值)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 c3 = c1.complex_add(c2);//此处存在对象的赋值和复制问题

//对象的复制,存在于实参到形参以及函数的返回中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//实现机制实例
//重载=号实现对象赋值
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);
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年11月09日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++区别于其他语言的知识点总结
C++是博主的一门限选课,所使用的课本为谭浩强老师的《C++面向对象程序设计》(第二版),这本书内容全面,简单易懂,也强烈推荐给大家(尤其是初学者)。但对于有Java/C#知识的人来说很多地方的讲解略显冗余。这门课的授课老师编程经验丰富,因此可以跳开课本进行更为简洁精确的说明讲解。虽然是只有8周的限选课,博主依然对课堂知识作了记录,这些都是精华所在,即大家所言的老程序员的经验。 (正文字体采用“等线”,最新版win10可以达到最佳显示效果) 1.使用const定义常量 //C语言定义常量 #defin
Steve Wang
2018/02/05
9210
浅复制,深复制详解下载_复制时如何跳过一部分内容
有关浅复制与深复制的定义为:对类进行复制的时候按位复制,即把一个对象各数据成员的值原样复制到目标对象中。当类中涉及到指针类型数据成员的时候,往往就会产生指针悬挂问题。
全栈程序员站长
2022/09/23
3680
浅复制,深复制详解下载_复制时如何跳过一部分内容
【C++】Chapter01 类与对象
封装的定义:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
Skrrapper
2025/03/25
170
【C++】Chapter01 类与对象
C++核心编程学习
包含常量区;主要是存放全局变量,静态变量,字符串常量,const修饰的全局变量, 不包括const修饰的局部变量(区域的数据在程序结束后由操作系统释放)
买唯送忧
2021/09/11
4010
拷贝构造函数:对象复制的重要工具
功能: 使用一个已经存在的对象来初始化一个新的同一类型的对象。 声明: 只有一个参数并且参数为该类对象的引用 如果类中没有说明拷贝构造函数,则系统会自动生成一个缺省复制构造函数,作为该类的公有成员。
洁洁
2023/12/07
1710
【C++指南】类和对象(五):类的默认成员函数——全面剖析 赋值运算符重载函数
一般情况下,⼀个类如果显式实现 了析构并释放资源,那么他就需要显式写赋值运算符重载,否则就不需要
倔强的石头
2024/12/06
1240
C++ 面向对象 一
使用内联函数的时候,编译器会进行自动替换,即类似于C语言中的宏。以减少入栈和出栈的操作。
mySoul
2018/10/20
4440
C++之面向对象的语法笔记
最近项目在开发涉及到的C++内容相对比较多,整理一下,过程中用到的C++面向对象的语法笔记
包子388321
2020/06/16
1.6K0
类和对象(构造深入)
普通函数指针:返回值类型(*指针名)(参数列表) 注意:void( * p_fun)(int,int);和void * p_fun(int,int);的区别 前者是定义函数指针,后者是函数声明(指针函数)
小飞侠xp
2018/12/27
9880
【C++篇】手撕 C++ string 类:从零实现到深入剖析的模拟之路
在 C++ 标准库中,string 类是用于字符串操作的一个非常常见和重要的类,它极大地简化了开发者处理字符串的过程。然而,为了深入理解 C++ 的核心机制,特别是内存管理、深拷贝与浅拷贝的差异、运算符重载等底层细节,自己实现一个简易的 string 类是一个很好的练习。
半截诗
2024/10/09
3050
【C++】—掌握STL string类:string的模拟实现
浅拷贝也称之为位拷贝,编译器只是将对象中的值拷贝过来。如果对象中管理资源,最后就导致多个对象公用同一份资源,当一个对象销毁时就会导致该资源释放掉,而此时的其他对象不知道该资源已经被释放掉,所以继续对资源进行操作时,就会导致访问违规。 可以使用深拷贝解决浅拷贝的问题即:每个对象都有一份独立的资源,不需要和其他对象共享。
_孙同学
2024/11/13
620
【C++】侯捷C++面向对象高级编程(上)
面向对象,就是将数据和处理这些数据的函数包在一起。数据只有这个函数能够看到,不会和其他的混杂在一起。
半生瓜的blog
2023/05/12
4400
【C++】侯捷C++面向对象高级编程(上)
【C++】继承
在社会关系中,一个人往往会拥有不同的身份,基于不同身份,有用不同的信息,比如当学生有学号,成为工人有工号等,可能会有不同的外号,但是基于人的最根本的身份,他们都要自己唯一的名称、性别等属性。
ZLRRLZ
2024/12/13
650
【C++】继承
滴水逆向初级-C++(三)
1、什么是封装: 将函数定义到结构体内部,就是封装。 2、什么是类: 带有函数的结构体,称为类。 3、什么是成员函数: 结构体里面的函数,称为成员函数。
zhang_derek
2021/04/13
6390
【C++】继承
继承(inheritance)机制是⾯向对象程序设计使代码可以复⽤的最重要的⼿段,它允许我们在保持原有类特性的基础上进⾏扩展,增加⽅法(成员函数)和属性(成员变量),这样产⽣新的类,称派⽣类。继承 呈现了⾯向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的函数层次的复⽤,继承是类设计层次的复⽤。
用户11375356
2024/11/22
610
【C++】继承
C++避坑---赋值运算符函数中的自我赋值和异常控制
在定义某个类的赋值运算符函数的时候,如果涉及到动态内存分配,我们首先会考虑到深拷贝和浅拷贝这种容易犯错的问题。但有些时候容易忽略自我赋值的风险和异常控制方面的问题。我们先看一个例子,如下:
艰默
2023/05/17
4410
C++避坑---赋值运算符函数中的自我赋值和异常控制
C++之类和对象的使用(三)
对象数组 如果构造函数只有一个参数,在定义数组时可以直接在等号后面的花括号内提供。Student stud[3]={90,92,01};//合法 如果构造函数有多个参数,则不能用在定义时直接所提供所有实参的方法。 但可以如下定义: //构造函数有三个参数:学号,年龄,成绩 Student stud[3]{ Student(1000,19,22); Student(1001,19,22); Student(1002,19,22); };   对象指针 指向对象的指针 class Box {public:
互联网金融打杂
2018/04/03
8870
C++之类和对象的使用(三)
C++ —— 关于继承(inheritance)
使用类模版模拟实现一个栈,可以使用vector/list/deque来当做底层容器,核心就是类模版的继承
迷迭所归处
2024/11/19
770
C++ —— 关于继承(inheritance)
编译器角度看C++复制构造函数
关于复制构造函数的简单介绍,可以看我以前写过的一篇文章C++复制控制之复制构造函数该文章中介绍了复制构造函数的定义、调用时机、也对编译器合成的复制构造函数行为做了简单说明。本文因需要会涉及到上文的一些知识点,但还是推荐先阅读上文。
Tencent JCoder
2022/05/06
6070
C++ | 对象的初始化和清理
今天来分享一下C++中对象的初始化和清理。主要是介绍构造函数和析构函数,另外也会讲一下列表初始化和静态成员这些。本节内容主要参考自黑马程序员:https://www.bilibili.com/video/BV1et411b73Z
飞哥
2020/08/05
1.6K0
相关推荐
C++区别于其他语言的知识点总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验