《C++ Primer》13.1.4节练习
练习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节练习相关推荐
- C++primer 13.1.6节练习
练习13.18 1 #include <iostream> 2 #include <string> 3 #include <memory> 4 5 using na ...
- C++primer 13.6.2节练习
练习13.49 13.50 1 #include <iostream> 2 #include <string> 3 #include <utility> 4 #in ...
- 《C++ Primer》13.1.3节练习
练习13.9: 析构函数完成与构造函数相反的工作:释放对象使用的资源,销毁非静态数据成员.从语法上看,它是类的一个成员函数,名字是波浪号接类名,没有返回值,也不接受参数. 当一个类没有定义析构函数时, ...
- 《C++ Primer》13.1.2节练习
练习13.6: 拷贝赋值运算符本身是一个重载的赋值运算符,定义为类的成员函数,左侧运算对象绑定到隐含的this参数,而右侧运算对象是所属类类型的,作为函数的参数,函数返回指向其左侧运算对象的引用. 当 ...
- 《C++ Primer》13.1.1节练习
练习13.1: 如果构造函数的第一个参数是自身类类型的引用,且所有其他参数(如果有的话)都有默认值,则此构造函数是拷贝构造函数.拷贝构造函数在以下几种情况下会被使用: ●拷贝初始化(用=定义变量). ...
- 《C++ Primer》13.1.6节练习(部分)
练习13.18: #include <iostream> #include <string> using namespace std;class Employee {priva ...
- 【C++ Primer | 13】课后习题答案
文章目录 13.1.4节目练习 13.2节练习 13.2.2练习 13.1.4节目练习 练习13.14 #include <iostream> using namespace std;cl ...
- C++primer 9.2.1节练习
练习9.3 迭代器begin和end必须指向相同的容器,end可以与begin指向相同的位置,但不能指向begin之前的位置: 练习9.4 1 #include <iostream> 2 ...
- C++primer 10.2.1节练习
练习10.3 1 #include<iostream> 2 #include<string> 3 #include<vector> 4 #include <s ...
最新文章
- call/apply/bind 的理解与实例分享
- 65条最常用正则表达式
- [BZOJ2125]最短路
- 第一百五十三期: 云迁移可能失败的5种方式以及成功的5种方式
- Q六娱乐网整站源码分享
- django 1.8 官方文档翻译:14-1 按需内容处理
- Linux下载工具wget详解
- 微软发布 .Net Core 3.0 版重大更新,对开发者来说意味着什么?
- Atitit webservice的发现机制 discover机制
- 如何判断一个正数是奇数还是偶数,奇数输出odd,偶数输出even
- 快速“美女找茬”(辅助工具)
- 做产品也要造概念,讲故事,用优雅的措辞美化自己
- python程序设计山东联盟期末考试_知到_Python程序设计基础(山东联盟)_章节测试答案...
- 《 Programming Collective Intelligence》案例介绍与分析——Making Recommendations
- 【历史上的今天】9 月 6 日:Facebook 收购 Instagram;华为发布 5G 芯片;惠普并购康柏
- BI神器Power Query(15)-- PQ制作时间维度表(4)
- 跟着狂神学Docker(精髓篇)
- 有关Shiro中Principal的使用
- COM组件开发(四)——VC++调用COM组件的方法
- VHDL语言设计8421码加法器(使用quartus)
热门文章
- GIS宣传片《地理空间信息革命》视频全集
- 【ArcGIS风暴】基于ArcGIS空间分析功能研究渭河流域镇驻地空间分布格局
- Android之library class android.webkit.WebViewClient depends on program class android.net.http.SslErro
- linux网络编程之inet_addr和inet_ntoa使用总结
- 用beyond compare解决git不能同步项目重新下载项目然后就行对比解决冲突
- Nginx指南和配置详解
- lru算法实现 redis_使用数组与双向链表实现一个简单的LRU算法
- linux桌面版排行2019_新兴的桌面发行版 Septor Linux 发布 2019 版
- 王道408数据结构——第一章 绪论
- linux+arch系统下载,Linux