这节课在p26.拷贝构造中讲的很清楚,建议大家耐心的去看下。

什么时候会发生拷贝构造:

  1. 对象之间的初始化赋值
  2. 使用对象作为变量进行函数传参(通常使用引用来传参从而减去不必要的拷贝构造,提高效率和代码健壮性)
  3. 函数中返回对象的值
  1. class A
  2. {...}
  3.  
  4. A a0; //构造函数产生对象a0
  5. A a1(a0); //发生拷贝构造,直接走拷贝构造函数进行初始化
  6. A a2=a0; //和上一行完全一致,并且会发生拷贝构造,这里要注意的是在c++中 “=”和()做的工作是一致的就是赋值(拷贝构造函数进行复制);构造函数的初始化列表 也是会走拷贝构造的
  7. A a3; //构造函数 产生a3
  8. a3=a0; //仅赋值

拷贝构造函数的形式为      T::T(const T&);    如果没有在类中给出声明及定义,c++会默认给出;

代码解释下拷贝构造的形式:

首先说明下,拷贝构造也是构造,既然是构造在程序结束的时候就会调用析构函数来销毁构造出的对象,那我们就利用这种机制,使用静态全局变量来做一个标记变量 objectCount,我们将会看到拷贝构造函数的调用过程。

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. static int objectCount = 0;
  6.  
  7. class HowMany
  8. {
  9. public:
  10. HowMany(){ objectCount++; print("HowMany()");}
  11. void print(const string& msg = "")
  12. {
  13. if(msg.size()!=0) cout << msg << ":";
  14. cout << "objectCount = " << objectCount << endl;
  15. }
  16. HowMany(const HowMany & h) { objectCount++; print("copy constructor HowMany");} //这里我们将隐藏的默认拷贝构造函数显式的写出来,并加上objectCount++,string的赋值就是通过这种方式进行的
  17. ~HowMany()
  18. {
  19. objectCount--;
  20. print("~HowMany()");
  21. }
  22. };
  23.  
  24. HowMany f(HowMany x) { //这里调用拷贝构造 讲下边的对象h形参通过拷贝构造给x
  25. cout << "begin of f" << endl;
  26. x.print("x argument inside f()");
  27. cout << "end of f" << endl;
  28. return x; //这里反回值会付给h2 同时也会调用拷贝构造函数给h2赋值
  29. }
  30.  
  31. int main()
  32. {
  33. HowMany h;
  34. h.print("after construstion of h");
  35. HowMany h2 = f(h);
  36. h.print("after call to f()");
  37. }

目录

  1. c++(翁恺浙大公开课) 笔记0
  2. static在c\c++中的作用(翁恺c++公开课[28-29]学习笔记)
  3. c++对象初始化(翁恺c++公开课[10])
  4. c++构造函数的初始化列表(翁恺c++公开课[13])
  5. c++继承:公有、私有、保护
  6. c++子类父类关系(翁恺c++公开课[15-16]学习笔记)
  7. c++拷贝构造函数(翁恺c++公开课[26-27]学习笔记)
  8. c++多态性及多态的内部实现(翁恺c++公开课[23-24])
  9. c++中的运算符重载operator1(翁恺c++公开课[30]学习笔记)
  10. c++中的运算符重载operator2(翁恺c++公开课[31-33]学习笔记)
  11. c++模板(翁恺c++公开课[34-35]学习笔记)
  12. 最好不要在头文件中写函数定义

c++拷贝构造函数(翁恺c++公开课[26-27]学习笔记)的更多相关文章

  1. c++构造函数的初始化列表(翁恺c++公开课[13])

    初始化列表形式: class Point { private: const float x,y; Point(float xa = 0.0, flato ya = 0.0):y(ya),x(xa) { ...

  2. c++中的Exceptions异常处理(翁恺c++公开课[36])

    Exceptions用于处理Run-time Error: //文件读取的异常捕获伪代码 try{ open the file; determine its size; allocate that m ...

  3. c++多态性及多态的内部实现(翁恺c++公开课[23-24])

    多态是在父类函数的前面加上 “virtual” 关键字,使子类与父类同名的函数产生一种联系: 多态会用到两个特性:向上造型.动态绑定 向上造型是指:拿一个子类对象当作父类来看待,比如下边代码中的子类E ...

  4. c++对象初始化(翁恺c++公开课[10])

    c++对象初始化 就是去调用构造函数来完成初始化操作: 构造函数有无参数的构造函数.有参数构造函数.默认构造函数(编译器给我们实现的)...(拷贝构造函数之后说) 注意:默认构造函数只有在我们自己没有 ...

  5. c++子类父类关系(翁恺c++公开课[15-16]学习笔记)

    关于类的继承有三种:public继承.private继承.protected继承 首先说明,关于类的成员变量.函数的权限有三种(public.private.protected) 我们通常会让所有的成 ...

  6. c++模板(翁恺c++公开课[34-35]学习笔记)

    为什么要有模板(templates):当我们需要一个列表(list),列表中元素可能都为X类型也可能都为Y类型,怎么来实现呢? 定义基类?可以实现,很多情况下可能不够简明的表达设计思想 克隆代码(写一 ...

  7. c++中的运算符重载operator2(翁恺c++公开课[31-33]学习笔记)

    上一篇operator1中,大概说了下重载的基本用法,接下来对c++中常见的可重载运算符归一下类,说一下它们的返回值,讨论下较为复杂的运算符重载上的坑

  8. c++中的运算符重载operator1(翁恺c++公开课[30]学习笔记)

    运算符重载规则: 只有已经存在的运算符才能被重载,不能自己制造一个c++中没有的运算符进行重载 重载可以在类或枚举类型内进行,也可以是全局函数,但int.float这种已有的类型内是不被允许的 不能二 ...

  9. static在c\c++中的作用(翁恺c++公开课[28-29]学习笔记)

    static相对来说是一个较复杂的修饰符,c++中的static在c的基础之上又包含了static在类中的应用(也就是说多了static的成员变量和static的成员函数):c\c++中静态变量.对象 ...

随机推荐

  1. django 创建管理员用户

    7.2 create 创建管理员用户: python manage.py run server python manage.py createsuperuser password :123456789 ...

  2. 题解 SP19148【INS14G - Kill them All】

    SP19148[INS14G - Kill them All] 前置知识:组合数 乘法逆元 感觉其他博客讲的不是很清楚,也没有说组合数公式是怎么来的,我这样数论极菜的萌新看了好久才想明白qwq.. 还 ...

  3. NIO的理解

    一.缓冲区(Buffer):在java NIO中负责数据的存取,实际上就是数组,用于存储不用数据类型的数据,根据数据类型不同(boolean除外),提供了相应类型的缓冲区(ByteBuffer,Cha ...

  4. RTU license

    Right to Use (RTU) licensing is a model in which licenses are not tied to a unique device identifier ...

  5. slot插槽

    具名插槽只能是template模板标签 插槽组件 <section class="hello"> <slot>Welcome</slot> &l ...

  6. ASP.NET CORE 基础知识(一):概述【下】

    此为系列文章,对MSDN ASP.NET Core 的官方文档进行系统学习与翻译.其中或许会添加本人对 ASP.NET Core 的浅显理解 配置 ASP.NET Core提供了一个配置框架,其能够从 ...

  7. CSS3实现魔方动画

    本文将借助css3实现魔方动画效果,设计思路如下: HTML方面采用六个div容器形成六个立方面: CSS方面采用transform-style: preserve-3d;形成三维场景:transfo ...

  8. 虚拟机中安装centos7后无法上网,使用桥接网络+ssh

    首先是桥接网络解决无法上网的问题: 1保证你Vmware里面的虚拟机是关机状态2右键点击电脑屏幕右下角小电脑图标,选择打开网络与共享中心,然后点击弹出来的窗口左上角的“更改适配器设置”.这里指的是你W ...

  9. Spring Boot中Restful Api的异常统一处理

    我们在用Spring Boot去向前端提供Restful Api接口时,经常会遇到接口处理异常的情况,产生异常的可能原因是参数错误,空指针异常,SQL执行错误等等. 当发生这些异常时,Spring B ...

  10. Java入门笔记 08-注解

    1. 注解:通过 @interface 关键字进行定义2. 元注解:是一种基本注解,但是它能够应用到其它的注解上面.@Retention:解释说明了这个注解的的存活时间.取值如下: Retention ...