C++ Primer 第五版 中文版 练习 13.14&13.15&14.16&14.17
练习 13.14:假定numbered是一个类,它有一个默认构造函数,能为每个对象生成一个唯一的序号,保存在名为mysn的数据成员中。
假定numbered使用合成拷贝控制成员,并给定如下函数:
void f(numbered s) { std::cout << s.mysn << std::endl; }
则下面代码输出什么内容??
numbered a,b=a,c=b;
f(a);f(b);f(c);
答:输出一样的内容,都为a对象的mysn的值。
练习 13.15:假定numbered定义一个拷贝构造函数,能生成一个新的序号。
这会改变上题中调用的输出结果吗?如果会改变,为什么?新的输出结果是什么?
答:不会改变输出结果,输出一样的内容,都为对象的mysn的值。
练习13.16:如果f中的参数是const numbered &,将会怎样?这会改变输出结果吗?如果会改变,为什么?新的输出结果是什么?
答:不会改变输出结果。
练习 13.17:分别编写前三题中所描述的 numbered 和 f ,验证你是否正确预测了输出结果。
答:
#include <iostream>
#include <algorithm>
class numbered
{
public:
//练习 13.14假设这就是默认构造函数……用rand来生成唯一的序号。预测输出结果是一样的都是a的mysn值
numbered():mysn(rand()){}
//拷贝构造函数,练习 13.15 这上依然不会改变输出结果,一样的都是a的mysn值
numbered(const numbered &num) :mysn(num.mysn){}
//为了方便输出声明为public
int mysn;
};
//练习13.14中的函数
void f(numbered s) { std::cout << s.mysn << std::endl; }
//练习13.16中的函数 不会改变输出结果,一样都是a的输出结果。
void f(const numbered &s) { std::cout << s.mysn << std::endl; }
using namespace std;
int main()
{
numbered a, b = a, c = b;
f(a);
f(b);
f(c);
return 0;
}
输出结果总是一样的: