练习13.14:

这是一个典型的应该定义拷贝控制成员的场合。如果不定义拷贝构造函数和拷贝赋值运算符,依赖合成的版本,则在拷贝构造和赋值时,会简单复制数据成员。对本问题来说,就是将序号简单复制给新对象。
因此,代码中对a、b、c三个对象调用函数f,会输出三个相同的序号——合成拷贝构造函数被调用时简单复制序号,使得三个对象具有相同的序号。

练习13.15:
在此程序中,都是拷贝构造函数在起作用,因此定义能生成新的序号的拷贝构造函数会改变输出结果。
但注意,新的输出结果不是0、1、2,而是3、4、5。
因为在定义变量a时,默认构造函数起作用,将其序号设定为0。当定义b、c时,拷贝构造函数起作用,将它们的序号分别设定为1、2。
但是,在每次调用函数f时,由于参数是numbered类型,又会触发拷贝构造函数,使得每一次都将形参s的序号设定为新值,从而导致三次的输出结果是3、4、5。

练习13.16:
会改变输出结果,新结果是0、1、2。
原因是,将参数改为const numbered &。由于形参类型由类类型变为引用类型,传递的不是类对象而是类对象的引用。这意味着调用f时不再触发拷贝构造函数将实参拷贝给形参,而是传递实参的引用。因此,对每次调用,s都是指向实参的引用,序号自然就是实参的序号。而不是创建一个新的对象,获得一个新序号。

练习13.17:

#include <iostream>
using namespace std;class numbered {private:static int seq;public:numbered() {mysn = seq++;}numbered(numbered &n) {mysn = seq++;}int mysn;
};int numbered::seq = 0;void f(numbered s) {cout << s.mysn << endl;
}int main() {numbered a, b = a, c = b;f(a);f(b);f(c);return 0;
}

测试结果:

#include <iostream>
using namespace std;class numbered {private:static int seq;public:numbered() {mysn = seq++;}numbered(numbered &n) {mysn = seq++;}int mysn;
};int numbered::seq = 0;void f(const numbered &s) {cout << s.mysn << endl;
}int main() {numbered a, b = a, c = b;f(a);f(b);f(c);return 0;
}

测试结果:

《C++ Primer》13.1.4节练习相关推荐

  1. C++primer 13.1.6节练习

    练习13.18 1 #include <iostream> 2 #include <string> 3 #include <memory> 4 5 using na ...

  2. C++primer 13.6.2节练习

    练习13.49 13.50 1 #include <iostream> 2 #include <string> 3 #include <utility> 4 #in ...

  3. 《C++ Primer》13.1.3节练习

    练习13.9: 析构函数完成与构造函数相反的工作:释放对象使用的资源,销毁非静态数据成员.从语法上看,它是类的一个成员函数,名字是波浪号接类名,没有返回值,也不接受参数. 当一个类没有定义析构函数时, ...

  4. 《C++ Primer》13.1.2节练习

    练习13.6: 拷贝赋值运算符本身是一个重载的赋值运算符,定义为类的成员函数,左侧运算对象绑定到隐含的this参数,而右侧运算对象是所属类类型的,作为函数的参数,函数返回指向其左侧运算对象的引用. 当 ...

  5. 《C++ Primer》13.1.1节练习

    练习13.1: 如果构造函数的第一个参数是自身类类型的引用,且所有其他参数(如果有的话)都有默认值,则此构造函数是拷贝构造函数.拷贝构造函数在以下几种情况下会被使用: ●拷贝初始化(用=定义变量). ...

  6. 《C++ Primer》13.1.6节练习(部分)

    练习13.18: #include <iostream> #include <string> using namespace std;class Employee {priva ...

  7. 【C++ Primer | 13】课后习题答案

    文章目录 13.1.4节目练习 13.2节练习 13.2.2练习 13.1.4节目练习 练习13.14 #include <iostream> using namespace std;cl ...

  8. C++primer 9.2.1节练习

    练习9.3 迭代器begin和end必须指向相同的容器,end可以与begin指向相同的位置,但不能指向begin之前的位置: 练习9.4 1 #include <iostream> 2 ...

  9. C++primer 10.2.1节练习

    练习10.3 1 #include<iostream> 2 #include<string> 3 #include<vector> 4 #include <s ...

最新文章

  1. call/apply/bind 的理解与实例分享
  2. 65条最常用正则表达式
  3. [BZOJ2125]最短路
  4. 第一百五十三期: 云迁移可能失败的5种方式以及成功的5种方式
  5. Q六娱乐网整站源码分享
  6. django 1.8 官方文档翻译:14-1 按需内容处理
  7. Linux下载工具wget详解
  8. 微软发布 .Net Core 3.0 版重大更新,对开发者来说意味着什么?
  9. Atitit webservice的发现机制 discover机制
  10. 如何判断一个正数是奇数还是偶数,奇数输出odd,偶数输出even
  11. 快速“美女找茬”(辅助工具)
  12. 做产品也要造概念,讲故事,用优雅的措辞美化自己
  13. python程序设计山东联盟期末考试_知到_Python程序设计基础(山东联盟)_章节测试答案...
  14. 《 Programming Collective Intelligence》案例介绍与分析——Making Recommendations
  15. 【历史上的今天】9 月 6 日:Facebook 收购 Instagram;华为发布 5G 芯片;惠普并购康柏
  16. BI神器Power Query(15)-- PQ制作时间维度表(4)
  17. 跟着狂神学Docker(精髓篇)
  18. 有关Shiro中Principal的使用
  19. COM组件开发(四)——VC++调用COM组件的方法
  20. VHDL语言设计8421码加法器(使用quartus)

热门文章

  1. GIS宣传片《地理空间信息革命》视频全集
  2. 【ArcGIS风暴】基于ArcGIS空间分析功能研究渭河流域镇驻地空间分布格局
  3. Android之library class android.webkit.WebViewClient depends on program class android.net.http.SslErro
  4. linux网络编程之inet_addr和inet_ntoa使用总结
  5. 用beyond compare解决git不能同步项目重新下载项目然后就行对比解决冲突
  6. Nginx指南和配置详解
  7. lru算法实现 redis_使用数组与双向链表实现一个简单的LRU算法
  8. linux桌面版排行2019_新兴的桌面发行版 Septor Linux 发布 2019 版
  9. 王道408数据结构——第一章 绪论
  10. linux+arch系统下载,Linux