创新工场2013年笔试题(一) 复制构造函数
来源:互联网 发布:linux是数据库软件么 编辑:程序博客网 时间:2024/06/15 05:18
以下程序输出结果
#include <iostream>using namespace std;class human{public:human(){count++;}static int count;void print(){cout<<"human count is:"<<count<<endl;}~human(){count--;print();}};int human::count=0;human f1(human h){h.print();return h;}void main(){human h1;human h2=f1(h1);h2.print();}
结果:
human count is 1 //f1中的h.print()
human count is 0 //退出f1时析构副本调用print()
human count is 0 //h2.print()
human count is -1 //退出main函数时析构h2
human count is -2 //析构h1
此题主要考复制构造函数,f1(h1) 传值传递,因此将h1复制一份最为副本传到f1函数中,而不是调用合成默认复制构造函数,因此count值不会自增。所以f1中的h.print()输出的是0,return h的时候调用合成默认复制构造函数。退出f1时析构副本,退出main析构h2,h1.
对原本题目做了一些扩展,
#include <iostream>using namespace std;class human{public:human(){cout<<"default strc"<<endl;count++;}human(const human&){cout<<"copy strc"<<endl;}human& operator=(const human&h){cout<<"operator="<<endl;return *this;}static int count;void print(){cout<<"human count is:"<<count<<endl;}~human(){count--;print();}};int human::count=0;human f1(human h){h.print();return h;}void main(){human h1;human h2=f1(h1);h2.print();human h3;h3=h2;}
类中定义了复制构造函数和赋值操作符,运行结果验证了f1传值和return语句都调用了复制构造函数。
为什么h3=h2调用了赋值操作符,而human h2=f1(h1)没有调用赋值操作符呢?
C++支持两种初始化形式:直接初始化和复制初始化。复制初始化使用=号,而直接初始化将初始化式放在圆括号中。直接初始化直接调用与实参匹配的构造函数,复制初始化总是调用复制构造函数。
string dot(3,’.’) //直接初始化
string dot=”...” //复制初始化
string dot1=dot;//复制初始化
这就是为什么human h2=f1(h1)没有调用赋值操作符,因为只是定义一个对象,处于初始化阶段,所以是复制初始化,赋值操作符只用于对象已经被定义后,被重新赋值,而不用于初始化。
human h3;//定义对象,直接初始化,调用构造函数
h3=h2;//赋值调用赋值操作符
- 创新工场2013年笔试题(一) 复制构造函数
- 创新工场笔试题
- 创新工场笔试题
- 创新工场笔试题
- 创新工场笔试题
- 创新工场笔试题
- 创新工场2013年笔试题(三)丑陋数
- 创新工场笔试题2013年校园招聘
- 创新工场笔试题2013年校园招聘
- 创新工场笔试题2013年校园招聘
- 创新工场笔试题2013年校园招聘
- 创新工场2013年校园招聘笔试题
- 创新工场笔试题2013年校园招聘
- 创新工场笔试题整理
- 创新工场笔试题整理
- 创新工场一道笔试题
- 创新工场笔试题整理
- 2014创新工场笔试题
- B. Samba Performance Tuning
- Top 10 Java Debugging Tips with Eclipse(Eclipse调试Java的10个技巧)
- NetBench7.03介绍及其下载地址
- vista系统下安装oracle 10g数据库后,出现SP2-1503,SP2-0152错误。
- ZOJ 2475 Benny's Compiler 深搜查找环路
- 创新工场2013年笔试题(一) 复制构造函数
- 嘲讽
- zz 动态库,头文件,命令搜索路径
- 使用rs.insertRow()将JTable中的数据插入到数据库sqlserver
- Using C++ objects in Delphi
- Java与Flex学习笔记(18)----Flex中创建右键菜单
- Java 免锁容器
- 好吧,从今天开始写博客。
- VS2008反汇编小解