c++primer13.1.4小节答案

        本文通过文件读写来实现每生成一个对象给予一个唯一序号,可做到每次运行可执行文件生成的序号也互相不同。

numbered类:(拷贝赋值运算符与题目要求无关,不影响进程输出,used.txt初始为0)

class numbered
{
public:
    /*默认构造函数*/
    numbered()
    {
        MakeMysn();
    }
    /*拷贝构造函数*/
    numbered(const numbered &)
    {
        MakeMysn();
    }
    /*拷贝赋值运算符*/
    numbered & operator=(numbered & n)
    {
        MakeMysn();
        return n;
    }
    unsigned int mysn;

private:
    void MakeMysn()
    {
        ifstream ifs("../used.txt"); // 只读方式打开存入对象唯一序号的文件
        ifs >> mysn;                 // mysn保存序号
        ofstream ofs("../used.txt"); // 清零重写方式打开存入对象唯一序号的文件
        ofs << mysn + 1;             // 更新序号并写入存入对象唯一序号的文件
    }
};

13.14输出结果:

ldl@ldl-virtual-machine:~/CppPrimer/bin$ ./main 
0
0
0

分析:numbered a, b = a, c =a:中只a调用默认构造函数1次,中定义时用 = 调用合成拷贝构造函数mysn为赋予唯一标号。mysn更新为1。

        f(a); f(b);f(c):非引用传参,发生拷贝,调用合成拷贝构造函数,mysn不更新。

13.15输出结果:

ldl@ldl-virtual-machine:~/CppPrimer/bin$ ./main 
4
5
6

分析:numbered a, b = a, c = b:中定义时用 = 调用默认构造函数1次,拷贝构造函数两次mysn,mysn更新为4;

        f(a); f(b);f(c):非引用传参,发生拷贝,调用拷贝构造函数,打印的是拷贝副本numbered的为一标号,mysn更新为7。

ldl@ldl-virtual-machine:~/CppPrimer/bin$ ./main 
7
8
9

分析:numbered a, b = a, c = b:同上mysn更新为10; 

        f(a); f(b);f(c);引用传参,不发生拷贝,打印的是abc定义初始化时各自更新的值,mysn不更新。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值