拷贝构造函数和构造函数不能分开说,他们都是初始化对象的一种方法。但是我们这里用构造函数辅助说明拷贝构造函数,主要说说拷贝构造函数的声明,用途和使用注意事项。


众所周知,构造函数是一个初始化类对象的函数,即使不显示调用,编译器也会隐式调用构造函数初始化类对象。同样的,拷贝构造函数是一种特殊的构造函数,目的也是初始化类对象,同样在不声明的情况下也会隐式调用该函数。而隐式调用拷贝构造函数的时候,我们称之为“浅拷贝”。但是,请注意一点,并不是说显示调用就是“深拷贝”,而是如果要深拷贝一定要显示调用

深浅拷贝后文会说,现在我们着重考虑其用途:

#include <iostream>
using namespace std;
class A{
private:int a;
public:A(int b):a(b){cout<<"构造函数"<<endl;}A(const A& c){a = c.a;cout<<"拷贝构造函数"<<endl;}~A(){cout<<"析构函数"<<endl;}
};
int main(){A a(100);   //调用构造函数A b = a;    //调用拷贝构造函数return 0;
}

看图,当创建了一个对象a时,编译器调用构造函数将a初始化为100。当又创建了一个对象b,将a赋值于b,此时调用拷贝构造函数将b初始化。最后由于调用了一次构造函数一次拷贝构造函数,所以析构函数被调用两次。

那么将主函数部分稍作修改,改成:

int main(){A a(100);A b(200);b = a;return 0;
}

会怎样呢?

可见,当我们对函数初始化完成,就不会再调用拷贝构造函数了,这时候b=a就是简单的赋值运算操作,和拷贝构造无关。


程序稍作改动,当类对象以参数的形式存在在普通函数中,会怎么样?

#include <iostream>
using namespace std;
class A{
private:int a;
public:A(int b):a(b){cout<<"构造函数"<<endl;}A(const A& c){a = c.a;cout<<"拷贝构造函数"<<endl;}~A(){cout<<"析构函数"<<endl;}void newA(A b){cout<<"bbbbb"<<endl;}
};
int main(){A a(100);a.newA(a);return 0;
}

理论上来说,调用函数newA(a)会利用构造函数构造一个新的b对象,实际上呢?

我们看到,它调用的是拷贝构造函数。为什么?

不知道,我们就改动一下程序,直接查看b对象中a的值:

void newA(A b){cout<<b.a<<endl;}

奇怪了,我们明明没有对b初始化,它却生成了b=100。是这样么?当然不是。

我们传的参数是a,而a已经被初始化为100。这时候形参是 A b = a 的。是不是看出点东西了。

所以,在调用void newA(A b){}的时候,实际上是创造了一个形参,这个形参被拷贝构造函数初始化为已经被构造函数初始化的a初始化。说的别扭,就上图。


总结一下,什么时候调用拷贝构造函数?就是当使用“=”赋值的时候,需要用到拷贝构造函数。

关于深浅拷贝,请看:深拷贝与浅拷贝

参考资料:https://www.cnblogs.com/alantu2018/p/8459250.html

构造函数与拷贝构造函数相关推荐

  1. 不存在从void转换到sqlist的适当构造函数_拷贝构造函数与赋值构造函数

    拷贝构造函数与赋值构造函数 在C++中,如果要创建一个新的类,并用已有的类来给它附初值.就要用到拷贝构造函数,拷贝构造函数又分为两种. 1.合成的拷贝构造函数 在你没有定义自己的拷贝构造函数而又调用了 ...

  2. String 的普通构造函数、拷贝构造函数、析构函数、赋值函数

    转自:http://blog.csdn.net/xiaoxiangzhu660810/article/details/8149398 题目:编写类String的构造函数.析构函数和赋值函数,已知类St ...

  3. C++ : 构造函数,拷贝构造函数,移动构造函数,拷贝赋值运算符,移动赋值运算符应用场景

    构造函数,拷贝构造函数,移动构造函数,拷贝赋值运算符,移动赋值运算符应用场景 #include <iostream> using namespace std;class Construct ...

  4. 构造函数、拷贝构造函数和析构函数的的调用时刻及调用顺序

    构造函数.拷贝构造函数和析构函数的的调用时刻及调用顺序 对象是由"底层向上"开始构造的,当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达 ...

  5. 默认构造函数和拷贝构造函数

    构造函数 构造函数包括默认构造函数.拷贝构造函数和一般构造函数. 在编程时,如果程序员不显式声明和定义上述函数,编译器将自动产生4个public inline的默认函数. A();          ...

  6. 构造函数,拷贝构造函数,赋值函数

        C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个 ...

  7. 类string的构造函数、拷贝构造函数和析构函数

    原文:http://www.cnblogs.com/Laokong-ServiceStation/archive/2011/04/19/2020402.html 类string的构造函数.拷贝构造函数 ...

  8. 构造函数、拷贝构造函数、赋值函数和析构函数

    文章目录 一.构造函数 1.认识构造函数 2.初始化列表 二.拷贝构造函数 1.类对象的拷贝 2.浅拷贝和深拷贝 三.赋值函数 四.析构函数 1.认识析构函数 2.销毁,清理? 3.析构函数来阻止该类 ...

  9. 移动构造函数和拷贝构造函数的区别

    讲讲移动构造函数与拷贝构造函数的区别 :移动构造函数是c++11的新特性,移动构造函数传入的参数是一个右值 用&&标出.一般来说左值可以通过使用std:move方法强制转换为右值.首先 ...

  10. C++ 构造函数、复制构造函数,拷贝构造函数(深拷贝、浅拷贝)

    文章目录 前言 一.什么是构造函数? 二.构造函数的分类 复制构造函数 复制构造函数被调用的三种情况 复制构造函数在以下三种情况下会被调用. 三.拷贝构造函数的分类 深.浅拷贝构造函数的区别 示例代码 ...

最新文章

  1. 手机号码归属地及运营商查询
  2. Java NIO ———— Buffer 缓冲区详解
  3. 微型计算机接口与技术期末,微机原理与接口技术期末考试试题及答案.pdf
  4. 〖谷腾读书会GTC〗Digital economy
  5. Android--从零开始开发一款文章阅读APP
  6. 解决开机后自动重起问题
  7. java输入年月判断当月天数_java输入月份,年份,显示对应月份的天数,
  8. CUDA ---- GPU架构(Fermi、Kepler)
  9. azure kinect三维点云_三维重建技术,你捋清楚了吗?本文适合小白
  10. HTML5期末大作业:仿天猫购物网站设计——仿天猫购物商城(7页) 网页设计作业,网页制作作业, 学生网页作业, 网页作业成品, 网页作业模板
  11. 施耐德驱动器维修ELAU控制器维修C400C600
  12. 论文笔记:2018 PRCV 顶会顶刊墙展
  13. lamp平台构建和phpMyAdmin工具
  14. rtf转换成html,转换Rtf到HTML
  15. 话说嵌入式软件工程师的工资待遇
  16. 关于floor函数与ceil函数与round函数
  17. Android开发:设置背景图片
  18. video标签无法播放视频
  19. 两种最为常用的数据挖掘方法论
  20. 鸿蒙大陆罪恶深渊哪里出,罪恶深渊 - 音阙诗听 - 5SING中国原创音乐基地

热门文章

  1. 测试工程师能力胜任考核
  2. mysql数据库连接不释放问题
  3. 计算机鼠标怎么设置在哪里,技巧:如何在计算机上调整鼠标移动速度?如何设置鼠标点击?...
  4. Js 字符串中截取相应数字
  5. C语言:斗地主发牌器
  6. 减号,破折号在idea中是有区别的(在开发过程中遇到的坑)
  7. IDEA运行JavaWeb服务器图片无法加载
  8. 苹果cmsv10自适应简约美化模板免费下载
  9. 实测-用vmware把系统装到U盘
  10. protocbuf 直播数据分析