什么时候调用拷贝构造函数

1. 调用函数时,实参是对象,形参不是引用类型

  • 如果函数的形参是引用类型,就不会调用拷贝构造函数

#include "Human.h"
using namespace std;//函数传值,会自动调用拷贝构造函数
//进行值传递的时候, 执行:Human man = h1;
void showMsg(Human man) {man.description();
}//如果函数的形参是引用, 不会调用拷贝构造函数
void showMsg1(const Human & man) {//添加了const后,不可以调用没有const的成员函数//man.setAddr((char*)"美国");man.description();
}//如果函数的形参是指针类型,不会调用拷贝构造函数
void showMsg2(const Human* man) {man->description();
}int main(void) {Human h1;//初始化调用拷贝构造函数Human h2= h1;   //自动调用拷贝构造函数Human h3(h1);   //自动调用拷贝构造函数//1. 初始化的时候调用拷贝构造函数h1.description();h2.description();h3.description();//2. 函数传值的时候调用拷贝构造函数showMsg(h1);  //普通参数,调用拷贝构造函数showMsg1(h1);    //引用参数,不调用拷贝构造函数showMsg2(&h1);  //指针参数,不调用拷贝构造函数system("pause");return 0;
}

2. 函数的返回类型是类,而且不是引用类型

  • 如果函数的返回值是引用,就不会调用拷贝构造函数
#include "Human.h"
using namespace std;//返回值为普通参数, 调用拷贝构造函数
Human getBetterMan1(const Human &h1, const Human &h2) {if (h1.getAge() > h2.getAge()) {return h1;} else {return h2;}
}//返回值是对象的引用, 不会调用拷贝构造函数
const Human& getBetterMan2(const Human& h1, const Human& h2) {if (h1.getAge() > h2.getAge()) {return h1;} else {return h2;}
}int main(void) {Human h1("张三", 18, "男");Human h2("李四", 20, "男");//函数返回临时对象, 调用拷贝构造函数getBetterMan1(h1, h2);//函数返回值是引用, 不调用拷贝构造函数getBetterMan2(h1, h2);system("pause");return 0;
}

3. 对象数组的初始化列表中,使用对象

#include "Human.h"using namespace std;int main(void) {Human F1("道明寺", 18, "男");Human F2("花泽类", 17, "男");Human F3("西门", 17, "男");Human F4("美作", 17, "男");//数组列表初始化,会调用拷贝构造函数Human Meteor[4] = { F1, F2, F3, F4 };for (int i = 0; i < sizeof(Meteor)/ sizeof(Meteor[0]); i++) {Meteor[i].description();}system("pause");return 0;
}

C++基础知识 - 什么时候调用拷贝构造函数相关推荐

  1. 何时会调用拷贝构造函数

    拷贝构造函数什么时候用到 当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用.也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用.以下情况都会调用拷 ...

  2. 自动调用拷贝构造函数的三种情况

    自动调用拷贝构造函数的三种情况 首先介绍拷贝构造函数的定义形式: class 类名 { public: 构造函数名称 (类名 &变量名) { 函数体 } -- }; 拷贝构造函数是使用类对象的 ...

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

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

  4. Python基础知识——跨目录调用文件

    sys.path.append() : 1.python本身不支持跨目录调用文件 2.该语句的目的是为了将父目录加入到sys.path (python的搜索模块的路径) 3.使得python可以导入父 ...

  5. matlab基础知识 (六) 调用函数

    MATLAB® 提供了大量执行计算任务的函数.在其他编程语言中,函数等同于子例程或方法. 要调用函数,例如 max,请将其输入参数括在圆括号中: 例 A = [1 3 5]; max(A) ans = ...

  6. 调用拷贝构造函数的场景

    一个对象以值传递的方式传入函数体 一个对象以值传递的方式从函数返回 一个对象需要通过另外一个对象进行初始化 转载于:https://www.cnblogs.com/drunknbeard/p/9419 ...

  7. 拷贝构造函数和赋值函数的一些知识

    /*******************拷贝构造函数和赋值运算符重载有以下两个不同之处***************************/ 1.拷贝构造函数生成新的类对象,而赋值运算符不能. 2. ...

  8. 拷贝构造函数的调用以及浅拷贝与深拷贝的理解

    今天一直在研究拷贝构造函数相关的东西,我这个大四老狗感觉又回到了大一学C++的时候.瞎捣鼓了一天,略微还是有些收获的,趁着脑子中的概念正热,把自己的心得赶紧整理出来分享给大家. ​       首先简 ...

  9. Cpp 对象模型探索 / 拷贝构造函数 和 赋值构造函数 的调用时机

    class A { public:A() {};A(const A& obj) {}A& operator=(const A& obj) { return *this; } } ...

最新文章

  1. android setAlpha 与 getBackground().setAlpha
  2. Oracle SQL Perfomance Tuning
  3. IDEA for Java Web
  4. UGUI_不规则按钮的响应区域
  5. 使用RequestFactory API进行Spring GWT集成
  6. jsp mysql书店源码_使用jsp数据库mysql实现网上购物书店课程设计
  7. 您不会相信Buzzfeed如何处理变更管理
  8. Java I/O体系之OutputStream和InputStream详细讲解
  9. iOS学习笔记-地图MapKit入门
  10. 『开源项目』基于STM32的智能垃圾桶之语音识别
  11. 大数据分析的方法有哪些
  12. Linux系统编程——延时函数
  13. 【AI志愿超强攻略】中国高校人工智能专业最全院校排名课程对比
  14. 校园一卡通管理信息系统的设计与实现(asp.net)
  15. 我就问你1MB和1Mb能一样吗?
  16. 磁共振指纹压缩感知框架
  17. arm有啥不同 intel_Intel处理器真的胜过ARM了?安兔兔什么的才不可靠呢
  18. 网络安全应急响应有哪些相关知识?
  19. The word ‘xx‘ is not correctly spelled问题的解决
  20. typescript环境配置

热门文章

  1. 2019-9-19【Javase】String字符串、装箱和拆箱、日期类、正则
  2. 关于数据库缓存的各种问题及其解决方法
  3. 实习中遇到值得积累下来的编程习惯(持续更新已结束-实习结束进入正式工作)
  4. 基于Vue和SpringBoot的毕业生追踪系统的设计和实现
  5. 用二维数组作为函数参数,编程计算并输出n×n阶矩阵的转置矩阵。
  6. 双非本科字节跳动Android面试题分享,吐血整理
  7. stm32贪吃蛇tftlcd显示实验
  8. kali激活phpstorm_phpstorm2018.2永久激活,亲测有效!!!
  9. 【面试题】Java语言有哪些优点
  10. C#CAD二次开发学习 两条直线求交点的方法IntersectWith的一点整理