C++---拷贝构造函数和赋值构造函数
摘要:最近看了一道面试题问: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++---拷贝构造函数和赋值构造函数相关推荐
- 不存在从void转换到sqlist的适当构造函数_拷贝构造函数与赋值构造函数
拷贝构造函数与赋值构造函数 在C++中,如果要创建一个新的类,并用已有的类来给它附初值.就要用到拷贝构造函数,拷贝构造函数又分为两种. 1.合成的拷贝构造函数 在你没有定义自己的拷贝构造函数而又调用了 ...
- 对于拷贝构造函数和赋值构造函数的理解
昨天晚上在看智能指针的时候,我发现自己连一个拷贝构造函数和赋值构造函数都写不出来,自己就尝试写了一个版本,结果发现错误百出,对于拷贝构造函数和赋值构造函数的理解仅仅停留在理论的方面,而不知其中太多的内 ...
- Cpp 对象模型探索 / 拷贝构造函数 和 赋值构造函数 的调用时机
class A { public:A() {};A(const A& obj) {}A& operator=(const A& obj) { return *this; } } ...
- 拷贝构造函数和赋值构造函数声明为私有的作用
转贴地址:http://blog.csdn.net/winer632/archive/2009/01/12/3762292.aspx 每个类只有一个赋值函数. 由于并非所有的对象都会使用拷贝构造函数和 ...
- 网易游戏笔试题:编写string类的构造函数、拷贝构造函数、赋值构造函数和析构函数
题目: class MyString { public: MyString(const char *str);//构造函数 MyString(const MyString& strClass) ...
- C++ 拷贝构造函数和赋值构造函数
在C++中复制控制是一个比较重要的话题,主要包括复制构造函数.重载赋值操作符.析构函数这三部分,这三个函数是一致的,如果类需要析构函数,则它也需要复制操作符 和 复制构造函数,这个规则被称为 C++的 ...
- C++中拷贝构造函数与赋值构造函数详解
1. 拷贝构造函数 什么时候会调用拷贝构造函数 ? 使用一个已经创建好的对象来初始化一个新的对象. Student mya("zhang3",22); ...
- C/C++中的拷贝构造函数和赋值构造函数
代码: 1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 class A{ 7 pu ...
- 拷贝构造函数和赋值函数的一些知识
/*******************拷贝构造函数和赋值运算符重载有以下两个不同之处***************************/ 1.拷贝构造函数生成新的类对象,而赋值运算符不能. 2. ...
最新文章
- 拦截导弹(最长递增子序列)
- php重定向 htaccess文件的编写
- 7月14号day6总结
- 深度学习(10)TensorFlow基础操作六: 数学运算
- qt和c#怎么选_请问目前做windows桌面应用程序,MFC、QT、C#哪个更好?
- Hadoop的安装与配置——设置单节点群集
- 常用SQL语句(增删查改、合并统计、模糊搜索)
- mysql infobright 缺点_infobright、mongodb优劣以及适用范围
- mysql执行脚本的方法
- 数据结构实验 6.宗教信仰
- 【cl】本地安装maven的jar包报错Artifact is already in the local repository
- ASP.NET Core管道深度剖析
- QCC小组活动推行知识系列介绍
- 一款性价比远超visio的画图小工具-Dia Diagram Editor(开源-跨平台)
- GoogleEarth崩了!!除了重装还可以这样解决......
- 计算机word设置斜框线,Word绘制多线斜线表头技巧-word技巧-电脑技巧收藏家
- 如何使静态图片做成动态效果?怎么让静态图片动起来
- JavaWeb程序设计课后答案
- MarkDown语法详解
- 安心收纳各种重要物品,不在家也能时刻守护安全,VOC智能保管箱G300上手测评
热门文章
- 用Itext把数据导出到Pdf文档
- 新浪微博封装类,以及常见问题sdk修改
- 相识、相恋、相伴【与51CTO的故事】
- JSP访问Hadoop 图片存储服务
- JavaScript中的nodeName nodeType nodeValue区别
- linux 内核驱动编程 简单例子 与_IO, _IOR, _IOW, _IOWR 宏解析
- Android Studio 1.01 + BlueStacks 开发调
- golang中的select详解
- 常考数据结构与算法:每k个节点反转链表
- linux 安装centos