练习13.14:
a使用默认构造函数生成序号,b,c使用a拷贝初始化,复制a中mysn数据成员的值
f(a),f(b),f(c)输出相同的值
练习13.15:
定义新的拷贝构造函数后,输出结果会发生改变,假设a生成的序号为0,b=a,c=b发生拷贝构造,产生新的序号1,2,即b的序号为1,c的序号为2。调用函数f,发生拷贝构造,每次调用都会重新设置序号,输出结果为3,4,5
练习13.16:
如果f中的参数是const numbered& ,结果会发生变化。假设a生成的序号为0,b=a,c=b发生拷贝构造,产生新的序号1,2,即b的序号为1,c的序号为2。调用函数f不发生拷贝构造,编号不变,为0,1,2
练习13.17:
#include <iostream>
#include <string>
using namespace std;
#include <vector>
class numbered
{
friend void f(numbered s);
public:
//默认构造函数
numbered() { mysn = label_num++; }
//拷贝构造函数
numbered(const numbered& nb) { mysn = label_num++; }
private:
static int label_num ;
int mysn = 0;
};
int numbered::label_num = 0;
void f(numbered s)
{
cout << s.mysn << endl;
}
int main()
{
numbered a, b = a, c = b;
f(a);
f(b);
f(c);
system("pause");
return 0;
}
结果:
使用const numbered& :
#include <iostream>
#include <string>
using namespace std;
#include <vector>
class numbered
{
friend void f(const numbered& s);
public:
//默认构造函数
numbered() { mysn = label_num++; }
//拷贝构造函数
numbered(const numbered& nb) { mysn = label_num++; }
private:
static int label_num ;
int mysn = 0;
};
int numbered::label_num = 0;
void f(const numbered& s)
{
cout << s.mysn << endl;
}
int main()
{
numbered a, b = a, c = b;
f(a);
f(b);
f(c);
system("pause");
return 0;
}
结果: