C++中拷贝构造函数

拷贝构造函数根据名字可以看得出来,当对象发生拷贝时调用的函数。该函数与构造函数和析构函数一样,不会被显式调用。我们只是说当对象发生拷贝时调用,那么什么时候会发生对象拷贝呢?我们来看一下。

  • 函数以对象参数进行传递时。
  • 函数以对象为返回值时。
  • 通过同一类型的对象来初始化新创建的对象时。
    如果类中没有定义拷贝构造函数,编译器会自动为我们创造一个。但是如果类中有指针变量或者动态内存分配时,必须自己手动添加一个拷贝构造函数。
    我们先来看一下,拷贝构造函数应该如何添加:
classname(const classname &obj)
{/*构造函数主体*/
}

下面的例子中,既是指针变量又是动态分配内存:

#include <iostream>
using namespace std;class Line{public:int getL(void);Line(int len);Line(const Line &obj);~Line();private:int *ptr;};Line::Line(int Len)
{cout << "调用构造函数" << endl;ptr = new int;*ptr = Len;}Line::Line(const Line &obj)
{cout << "调用拷贝构造函数,并为指针ptr分配内存" << endl;ptr = new int;*ptr = *obj.ptr;
}Line::~Line()
{cout << "调用析构函数,释放内存。" << endl;
}int Line::getL(void)
{return *ptr;
}void display(Line obj)
{cout << "Line的值为:" << obj.getL() << endl;
}int main()
{Line line(10);Line line2 = line;display(line);return 0;
}

对于这样的程序,在学习的过程中,我们应该先自己想一遍会输出什么,然后再点击运行,看运行结果和自己的有什么出入。
就这一个例子而言:首先定义line会调用构造函数初始化,然后line2 = line 发生了对象拷贝,会调用一次拷贝构造函数。然后在函数传参的过程中会发生一次拷贝,再调用一次拷贝构造函数。并且在最后,定义的line,line2被销毁时会调用两次析构函数,最重要的一点是,在子函数执行结束时也会调用一次析构函数,销毁传参时得到的拷贝构造函数。
根据分析让我们来看一下运行结果:

调用构造函数
调用拷贝构造函数,并为指针ptr分配内存
调用拷贝构造函数,并为指针ptr分配内存
Line的值为:10
调用析构函数,释放内存。
调用析构函数,释放内存。
调用析构函数,释放内存。

C++中拷贝构造函数相关推荐

  1. c++中拷贝构造函数被调用的时机

    1 c++中拷贝构造函数被调用的时机 拷贝构造函数被调用的几种情况: (1)当用类的一个对象去初始化该类的另一个对象时,系统会自动调用拷贝构造函数: (2)将一个对象作为实参传递给一个非引用类型的形参 ...

  2. 理解C++中拷贝构造函数

    拷贝构造函数的功能是用一个已有的对象来初始化一个被创建的同样对象,是一种特殊的构造函数,具有一般构造函数的所有特性,当创建一个新对象的时候系统会自动调用它:其形参是本类对象的引用,它的特殊功能是将参数 ...

  3. C++中拷贝构造函数与赋值构造函数详解

    1.  拷贝构造函数 什么时候会调用拷贝构造函数  ?            使用一个已经创建好的对象来初始化一个新的对象. Student mya("zhang3",22);   ...

  4. 深入探索C++对象模型一书中拷贝构造函数和NRV关系探讨

    转自:http://blog.guorongfei.com/2016/01/11/cpp-copy-constructor-nrv/ 最近深入探索C++对象模型一书,对于P67中最后一段话的第一句非常 ...

  5. c++中拷贝构造函数、默认无参构造函数、析构函数的理解

    1 struct Exmpl 2 { 3 //无参默认构造函数 4 Exmpl(){cout<<"Exmpl()"<<endl;} 5 //拷贝构造函数 6 ...

  6. C++中拷贝构造函数的形参为什么要是const引用

    1.首先为什么要是引用: 如对于 CBox(CBox initB);//复制构造函数一开始想到的原型 CBox cigar; CBox myBox(cigar); //如果编写这样一条语句 //那么将 ...

  7. 继承的时候,子类的拷贝构造函数和重载运算符的实现

    由[1] [2] 例子看出:子类中实现了拷贝构造和赋值函数,则调用子类的拷贝构造和赋值函数 [1]说明: 子类的拷贝构造中调用父类的拷贝构造: 子类的赋值函数中调用父类的赋值函数 #include&l ...

  8. 继承关系中的拷贝构造函数和赋值操作重载函数分析

    文章目录 1 继承关系中的拷贝构造函数和赋值操作重载函数分析 1 继承关系中的拷贝构造函数和赋值操作重载函数分析 在继承关系中,如果子类未实现拷贝构造函数,那么在子类进行拷贝构造操作时,会直接调用父类 ...

  9. C++学习笔记-----在重载的赋值运算函数中调用拷贝构造函数

    类的拷贝构造函数与赋值运算不同,拷贝构造函数是对这个类进行初始化的过程,而赋值是删除原有的东西,赋予它新的东西. 但是二者在实现上是互通的. template<class T> graph ...

最新文章

  1. 如何利用百度API地图进行定位,非gps 定位
  2. 流量低峰也烦人-lighttpd耗时长问题追查
  3. 数据库:SQLServer中in和 exists函数用法笔记
  4. 如何预热Web API,减少初次执行时间
  5. Php公钥加密data是空,php 生成加密公钥加密私钥实例详解
  6. windows7怎么清空电脑只剩系统
  7. sql-labs超详细教程
  8. usb加密狗破解软件
  9. 数字贸易标准体系框架
  10. 半导体智能制造系统之 APS高级计划和调度
  11. CSS3时光流逝效果
  12. 【王道考研】操作系统 笔记 第一章
  13. tesseract-ocr
  14. 孙溟㠭篆刻作品《叶》
  15. 日月光华深度学习(五)--卫星图像识别tf.data、卷积综合实例
  16. 阿里云Code设置ssh公钥
  17. 优麒麟的一些使用上的问题
  18. Motoman机器人离线编程——Motocom32开发简介
  19. 同步电机和异步电机的区别
  20. JavaScript高级 |如何玩转箭头函数?

热门文章

  1. 新工科背景下大数据专业导论课程的改革与探索
  2. 作者:李茹姣(1976-),女,博士,中国科学院北京基因组研究所生命与健康大数据中心高级工程师...
  3. 作者:鲍玉斌(1968-),男,博士,东北大学计算机科学系教授
  4. 作者:周园春(1975-),男,博士,中国科学院计算机网络信息中心研究员、博士生导师。...
  5. 编译原理——实验叁——基于YACC的TINY语法分析器的构建
  6. 洛谷P5709、P5710、P5711、P5712题题解(Java语言描述)
  7. 巧用TreeSet求解第k小整数(洛谷P1138题题解,Java语言描述)
  8. 【数据结构与算法】比较法分析查找算法与查找结构
  9. dedecms--在后台增加会员添加
  10. 常见排序算法(比较排序)及比较