拷贝构造函数

也是构造函数的一种,常用来以另一对象为模板创建新对象。如果对象中没有指针,可以直接使用数据库自带的该函数,但有指针就需要自己构建,这是为了避免造成浅拷贝,使两个指针指向同一内存空间。

例如

string s1;

string s2(s1);

拷贝赋值函数

作用和拷贝构造函数基本一致,区别在于拷贝构造的对象是新创建的,而赋值函数则是原来就有的。

在代码表示上也有所不同

拷贝构造如下:

inline string::string( const string& str)

{

m_data=new char[strlen(str.m_data+1)];

strcpy(m_data;str.m_data);

}

而拷贝赋值则多了监测是否为自我赋值、删除已有堆空间等操作。

代码如下:

inline string&string ::operator =(const string &str)

{

if(this==&str)

return this;

delete[] m_data;

m_data=new char[strlen(str.m_data+1)];

strcpy(m_data;str.m_data);

return this;

}

深浅拷贝差别是什么?

浅拷贝:如果复制的对象中引用了一个外部内容(例如分配在堆上的数据),那么在复制这个对象的时候,让新旧两个对象指向同一个外部内容,就是浅拷贝。(指针虽然复制了,但所指向的空间内容并没有复制,而是由两个对象共用,两个对象不独立,删除空间存在)

深拷贝:如果在复制这个对象的时候为新对象制作了外部对象的独立复制,就是深拷贝。

两种拷贝区别是什么?

1)拷贝构造函数是一个对象初始化一块内存区域,这块内存就是新对象的内存区,而赋值函数是对于一个已经被初始化的对象来进行赋值操作。
2)一般来说在数据成员包含指针对象的时候,需要考虑两种不同的处理需求:一种是复制指针对象,另一种是引用指针对象。拷贝构造函数大多数情况下是复制,而赋值函数是引用对象

3)实现不一样。拷贝构造函数首先是一个构造函数,它调用时候是通过参数的对象初始化产生一个对象。赋值函数则是把一个新的对象赋值给一个原有的对象,所以如果原来的对象中有内存分配要先把内存释放掉,而且还要检察一下两个对象是不是同一个对象,如果是,不做任何操作,直接返回。

拷贝赋值函数、拷贝构造函数相关推荐

  1. 【C++】Big Five: 构造函数、拷贝构造函数、拷贝赋值函数、移动构造函数、析构函数

    前言 C++类的成员变量是否含有"指针类型"直接决定了"Big Five"函数(就是标题中的5个函数)的编写!有无指针类型"成员变量造成Big Fiv ...

  2. C++学习笔记day47-----C++98-继承中的构造函数,析构函数,拷贝构造函数,拷贝赋值函数,多重继承,虚继承

    继承中的构造函数 当通过一个子类创建一个新的对象时,编译器会根据子类在初始化表中指明的基类的初始化方式去调用基类相应的构造函数.如果子类的初始化表中,并没有指明基类的初始化方式,编译器将会调用基类的无 ...

  3. strcpy函数_错误更正(拷贝赋值函数的正确使用姿势)

    这是一篇对什么是C++的The Rule of Three的错误更正和详细说明. 阅读时间7分钟.难度⭐⭐⭐ 虽然上一篇文章的阅读量只有凄惨的两位数,但是怀着对小伙伴负责的目的,必须保证代码的正确性. ...

  4. C++中的trivial和non-trivial构造/析构/拷贝/赋值函数及POD类型

    在侯捷的<STL源码剖析>里提到trivial和non-trivial及POD类型,相关知识整理如下. trivial意思是无意义,这个trivial和non-trivial是对类的四种函 ...

  5. 二说 拷贝构造函数 拷贝赋值函数

    文章目录 什么是拷贝构造函数 拷贝构造函数的调用时机 2.1 当函数的参数为类的对象时 2.2 函数的返回值是类的对象 2.3 对象需要通过另外一个对象进行初始化 浅拷贝与深拷贝 3.1 默认拷贝构造 ...

  6. copy ctor、copy assignment(拷贝构造函数和拷贝赋值函数)

    这个很早就搞明白了,只是这里系统整理一下. 例1: #include<iostream> using namespace std; class Test {public:Test(int ...

  7. C++ Primer 5th笔记(chap 13 拷贝控制)拷贝赋值函数

    1. 实现方式 通过拷贝赋值运算符operator =来实现,实际上是重载运算符(函数),其名字由关键字 operator 接表示要定义的运算符的符号组成.赋值运算符通常应该返回一个指向其左侧运算对象 ...

  8. 5. 三大函数:拷贝构造 拷贝赋值 析构函数

    String 类 拷贝构造和拷贝赋值应该怎么写 只要类里面带指针,一定不要用编译器的默认拷贝构造函数,一定要自己写 三个特殊函数 String (const char* cstr = 0); //构造 ...

  9. C++之拷贝构造、拷贝赋值

    拷贝构造 class Stu{public:int no;string name;int age; public:Stu(int no=10086, string name="jin&quo ...

最新文章

  1. 用C语言编写万年历6,C语言编写万年历
  2. 原创 | 一文读懂正态分布与贝塔分布
  3. 使用互斥体使程序只运行一个
  4. Blazor 应用如何使用 Azure Active Directory 认证登录
  5. 【转载保存】lucene优秀文章整理
  6. Spring中IOC和DI的概念
  7. [2019杭电多校第七场][hdu6646]A + B = C(hash)
  8. Atitit 为什么互联网机会这么大
  9. JavaScript成都市地图网页代码
  10. TCP/IP协议中IP数据保报文格式详解
  11. ISSCC上的微型计算机:体积更小、功耗更少、算力更强
  12. 计算机课程 图层关系认识 课件,全国“xx杯”计算机类说课大赛课件一等奖作品:图层蒙版说课课件...
  13. 新学期新FLAG,我与你共青春
  14. Linux搭建小型服务器——文件共享以及邮件服务器
  15. imageview设置资源图片
  16. mtk设备模型之LCM
  17. Unicode编码 ASCII码 utf-8编码 中英文字符所占字节
  18. 一文详尽之支持向量机算法!
  19. CAJ文献如何转成PDF?免费全篇转换的方法
  20. Android API Level一览表

热门文章

  1. 有趣的 CentOS 7 命令
  2. codemix java,CodeMix入门基础知识
  3. 论文阅读笔记——模式物种中个体的自动检测和识别
  4. oracle数据库分区表建立索引
  5. PHP代码审计(全)
  6. Nginx 使用 NACOS 实现服务发现和反向代理。不用reload
  7. EXCEL 2007 隔行与隔列求和
  8. 和大家讨论下公司出差补助问题
  9. Neutron 理解 (3): Open vSwitch + GRE/VxLAN 组网
  10. 【特征提取】Hog特征原理简介与代码实践