版权声明:本文为CSDN博主「杨龙飞的博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/whoamiyang/article/details/50859862

有的看着理所当然的东西往往被我们忽略其深层的意义,就像c++ 拷贝构造函数的参数为什么必须是引用类型呢,许多初学者都会说,“为了减少一次内存复制呗!”(其实刚开始我也是这样想的),但究竟是不是这样呢?来,看个小例子(你一定会说:昂....原来是这样啊!);

#include<iostream>
using namespace std;
class myExample
{int mTest;
public:myExample(int x):mTest(x){ //带参数的构造函数cout << "我是构造函数!"<<endl;}myExample(const myExample &ex){  //拷贝构造函数mTest=ex.mTest;cout <<"我是拷贝构造函数!"<<endl;}myExample& operator=(const myExample &ex){ //赋值函数(赋值运算符重载)cout << "赋值运算符重载" <<endl;mTest=ex.mTest;return *this;}void myTestfun(myExample ex){}
};int main(int argc,char *argv[])
{myExample a(2);myExample b(3);b=a;myExample c=a;b.myTestfun(a);return 0;

看结果

我是构造函数!                 //myExample a(2);
我是构造函数!                 //myExample b(3);
赋值运算符重载                 //b=a;
我是拷贝构造函数!               //myExample c=a;
我是拷贝构造函数!               //b.myTestfun(a);

如果你想的结果和上面的一样,恭喜你,你不用往下看了.

我们来分析一下:

第一个输出和第二个输出:调用构造函数,就不用解释了吧!

第三个和第四个为什么不一样呢?大家仔细看,b已经被实例化了,不需要构造,在这里,只是把a的值赋给它,只会调用赋值函数,而第四个c还没有被实例化,因此调用拷贝构造函数,构造处c,而不是赋值,

第五个实际上是把a作为参数传递给myTestfun(myExample ex),就相当于myExample ex=a;所以调用拷贝构造函数.

通过这个例子,我们来分析一下,拷贝构造函数为什么必须用引用类型,myExanple c=a;当我们不用引用作为拷贝构造函数的形参时,使得a通过值传递传递给c,因为要构造对象, 又会调用拷贝构造函数,就这样一直递归调用递归下去了.

所以绕了那么大的弯子,就是想说明拷贝构造函数的参数使用引用类型不是为了减少一次内存拷贝, 而是避免拷贝构造函数无限制的递归下去。

大家在想想,既然能设计为引用类型呢,那也就能设计成指针类型啊, 那为什么不呢,唯一区别点就在于效率吧!

如果形参是指针类型的,从编译的角度看:

程序在编译时分别将指针和引用添加到符号表上, 符号表上记录的是变量名及变量所对应的地址,指针在符号表上对应的地址是指针变量的地址值,指针变量中存的才是对应指向对象的地址值,而引用在符号上对应的地址值为引用的对应的地址值.在这里, 指针就像中介,我们租房子跟主家谈和跟中介谈,哪个划算,大家应该清楚吧!

拷贝构造函数的类型为什么必须使用引用类型相关推荐

  1. C++拷贝构造函数的参数为什么必须使用引用类型(无限递归)

    在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识. 但是如果我问你"拷贝构造函数的参数为什么必须使用引用类型?"这个问题, 你 ...

  2. Cpp / 拷贝构造函数的参数为什么必须使用引用类型

    表面原因:编译器无法通过,会报如下错误: error: invalid constructor; you probably meant 'CExample (const CExample&)' ...

  3. 拷贝构造函数的参数类型必须是引用

    在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识. 但是如果我问你"拷贝构造函数的参数为什么必须使用引用类型?"这个问题, 你 ...

  4. 【转】拷贝构造函数的参数类型必须是引用

    在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识. 但是如果我问你"拷贝构造函数的参数为什么必须使用引用类型?"这个问题, 你 ...

  5. C++拷贝构造函数与拷贝赋值运算符

    拷贝构造函数 拷贝构造函数定义了当用同类型的另一个对象初始化新对象时做什么,如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数.拷贝构造函数的参数类型 ...

  6. [ C++ ] — 拷贝构造函数(复制构造函数)

    拷贝构造函数 拷贝构造函数就是用 同一类型的对象复制成员值来初始化对象(当出现类的 "=" 赋值时,就会调用拷贝构造函数) 简单来说,拷贝构造函数就是来复制对象的 默认拷贝构造函数 ...

  7. C++ 语言拷贝构造函数、拷贝赋值运算符和析构函数

    C++ 语言拷贝构造函数.拷贝赋值运算符和析构函数 每个类都定义了一个新类型和在此类型对象上可执行的操作.类可以定义构造函数,用来控制在创建此类型对象时做什么.一个类通过定义五种特殊的成员函数来控制这 ...

  8. java拷贝构造函数

    浅拷贝就是指两个对象共同拥有同一个值,一个对象改变了该值,也会影响到另一个对象. 深拷贝就是两个对象的值相等,但是互相独立. 构造函数的参数是该类的一个实例.   Operator = 拷贝构造函数 ...

  9. 构造函数的调用场景--构造函数与拷贝构造函数、移动构造函数之辨

    在Scott Meyers的著作<Effective C++>条款5中,明确指出要"了解C++默默编写并调用哪些函数".这里通过一个简短的C++代码,阐述哪些场景调用构 ...

最新文章

  1. 从谷歌离职回到西湖大学,只为让AI听懂你的悲伤!
  2. 为什么科研总会走弯路【转】
  3. 网络字节序,主机字节序,地址转换函数
  4. 倡导国际农民丰收节贸易会-万祥军:中国-中东欧谋定启动.
  5. C++代理 Surrogate
  6. 支持mysql的报表开发工具_你不知道的mysql的3W法,内附超好用的报表工具
  7. HTML a链接下载文件之图片,文件,乱码等问题
  8. 小米9私密相册怎么找_“拼藏搜”,手机相册还能这么玩
  9. 父亲节重读朱自清先生的《背影》
  10. 第三十一章 考试作弊
  11. template 不能分别在.h和.cpp中定义模板
  12. 高聚合和低耦合的理解
  13. uniapp vite 路由跳转、登录模块封装(非无感登录)
  14. uniApp中图片文件上传插件(uniFilePicker)
  15. 7个步骤建立可用的机器学习模型
  16. 用Wireshark+小度WIFI抓手机app包
  17. PTA:7-32 计算天数
  18. 数据库操作的异常Cannot perform this operation because the connection pool has been close
  19. 大道至简大巧不工——和田玉雕中的哲学
  20. 激活函数 ReLU、sigmoid、tanh(双曲正切)

热门文章

  1. 高斯模糊java代码_简单的java高斯模糊算法
  2. layui框架中用laypage与后端搭配使用做分页列表
  3. 正则表达式匹配非,以及非字符串的匹配
  4. Vulnhub-Money Heist: 1
  5. luogu1966 火柴排队
  6. NetApp存储系统如何进入loader模式
  7. MySQL查找重复记录
  8. LightGBM原理
  9. 原来使Maya Arnold也能渲染出高质量作品!超赞小技巧
  10. 【S0018】【素材】工笔画免扣PNG素材强悍!黑金系企业展板+招聘海报大集合