摘要:最近看了一道面试题问:C++ 中拷贝赋值函数的形参能否进行值传递?我知道一般来说,拷贝构造函数的形参必须是自身类型的引用(《面向对象程序设计--C++语言描述(第二版)》这本书中有叙述),但是拷贝赋值函数的形参通常也是自身类型的引用,那么我们到底能不能将它们的形参改为值传递呢?

1,拷贝构造函数(不能进行值传递)

拷贝构造函数的原型有两种:

1 // 拷贝构造函数原型
2 Person( Person& );  // method 1
3 Person( const Person& );  // method 2
4
5 // 下面这种原型是错的
6 Person( Person );  // 不能进行值传递,只能传递引用

不能进行值传递的原因:如果自身参数不是引用,则永远不会调用成功------为了调用拷贝构造函数,我们必须拷贝它的实参,但为了拷贝实参,我们又必须调用拷贝构造函数,如此无限循环。

2,拷贝赋值函数(能进行值传递)

拷贝赋值函数的原型:

1 // 拷贝赋值函数原型
2 Person& operator=( const Person& );

为了与内置类型的赋值保持一致,赋值运算符通常返回一个指向其左侧运算对象的引用,这样就可以实现连等的功能(a = b = c)

为了验证我们的猜测(能进行值传递),我们做了一下验证,代码如下:

 1 #include <iostream>
 2 using namespace std;
 3
 4 class A {
 5 public:
 6     A():a(0){}
 7     A(int k) {a = k;}
 8     A& operator=(A other){ // 进行值传递而非引用传递
 9         this->a = other.a;
10     }
11     int get(){return a;}
12     ~A(){}
13 private:
14     int a;
15 };
16
17 int main(){
18     A a1(1);  // a1.get() == 1
19     A a2;  // a2.get() == 0
20     a2 = a1;
21     cout << a2.get() <<endl;
22     return 0;
23 }
24
25 // 输出结果
26 // 1

赋值构造函数实例(值传递)

转载于:https://www.cnblogs.com/zpcoding/p/10808547.html

C++---拷贝构造函数和赋值构造函数相关推荐

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

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

  2. 对于拷贝构造函数和赋值构造函数的理解

    昨天晚上在看智能指针的时候,我发现自己连一个拷贝构造函数和赋值构造函数都写不出来,自己就尝试写了一个版本,结果发现错误百出,对于拷贝构造函数和赋值构造函数的理解仅仅停留在理论的方面,而不知其中太多的内 ...

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

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

  4. 拷贝构造函数和赋值构造函数声明为私有的作用

    转贴地址:http://blog.csdn.net/winer632/archive/2009/01/12/3762292.aspx 每个类只有一个赋值函数. 由于并非所有的对象都会使用拷贝构造函数和 ...

  5. 网易游戏笔试题:编写string类的构造函数、拷贝构造函数、赋值构造函数和析构函数

    题目: class MyString { public: MyString(const char *str);//构造函数 MyString(const MyString& strClass) ...

  6. C++ 拷贝构造函数和赋值构造函数

    在C++中复制控制是一个比较重要的话题,主要包括复制构造函数.重载赋值操作符.析构函数这三部分,这三个函数是一致的,如果类需要析构函数,则它也需要复制操作符 和 复制构造函数,这个规则被称为 C++的 ...

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

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

  8. C/C++中的拷贝构造函数和赋值构造函数

    代码: 1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 class A{ 7 pu ...

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

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

最新文章

  1. 拦截导弹(最长递增子序列)
  2. php重定向 htaccess文件的编写
  3. 7月14号day6总结
  4. 深度学习(10)TensorFlow基础操作六: 数学运算
  5. qt和c#怎么选_请问目前做windows桌面应用程序,MFC、QT、C#哪个更好?
  6. Hadoop的安装与配置——设置单节点群集
  7. 常用SQL语句(增删查改、合并统计、模糊搜索)
  8. mysql infobright 缺点_infobright、mongodb优劣以及适用范围
  9. mysql执行脚本的方法
  10. 数据结构实验 6.宗教信仰
  11. 【cl】本地安装maven的jar包报错Artifact is already in the local repository
  12. ASP.NET Core管道深度剖析
  13. QCC小组活动推行知识系列介绍
  14. 一款性价比远超visio的画图小工具-Dia Diagram Editor(开源-跨平台)
  15. GoogleEarth崩了!!除了重装还可以这样解决......
  16. 计算机word设置斜框线,Word绘制多线斜线表头技巧-word技巧-电脑技巧收藏家
  17. 如何使静态图片做成动态效果?怎么让静态图片动起来
  18. JavaWeb程序设计课后答案
  19. MarkDown语法详解
  20. 安心收纳各种重要物品,不在家也能时刻守护安全,VOC智能保管箱G300上手测评

热门文章

  1. 用Itext把数据导出到Pdf文档
  2. 新浪微博封装类,以及常见问题sdk修改
  3. 相识、相恋、相伴【与51CTO的故事】
  4. JSP访问Hadoop 图片存储服务
  5. JavaScript中的nodeName nodeType nodeValue区别
  6. linux 内核驱动编程 简单例子 与_IO, _IOR, _IOW, _IOWR 宏解析
  7. Android Studio 1.01 + BlueStacks 开发调
  8. golang中的select详解
  9. 常考数据结构与算法:每k个节点反转链表
  10. linux 安装centos