创新工场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()输出的是0return h的时候调用合成默认复制构造函数。退出f1时析构副本,退出main析构h2h1.

 

对原本题目做了一些扩展,

#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;//赋值调用赋值操作符

 

原创粉丝点击