[学习笔记] C++ 历年试题解析(三)--小补充
小小的补充一下吧,因为李老师又把直招的卷子发出来了。。
题目
1.有指针变量定义及初始化int *p=new int[10];执行delete [] p;操作将结束指针变量p的生命期。(×)
解释:试了一下,p还真能再使用,所以不要理解错了,delete释放的是p指向内存的空间,他自己还活着,不过指向有点问题,所以delete之后还是让p指向NULL吧,这也是我们经常应当做的。
2.RMB那题,老师上课讲的,详细解析下
- #include <iostream>
- using namespace std;
- class RMB
- {
- public:
- RMB(unsigned int x=)
- {
- yuan = x / ;
- jiao = x / % ;
- fen = x % ;
- }
- operator unsigned int() const
- { // 类型转换函数,可将RMB类型的对象转换成unsigned int类型数据
- return *yuan+*jiao+fen;
- }
- RMB & operator++()
- {
- return *this = *this + ;
- }
- RMB operator++(int)
- {
- RMB temp(*this);
- ++(*this);
- return temp;
- }
- friend ostream & operator<<(ostream & out, const RMB & r)
- {
- out <<"¥"<< r.yuan <<"元"<< r.jiao <<"角"<< r.fen <<"分";
- return out;
- }
- protected:
- unsigned int yuan, jiao, fen;
- };
- int main()
- {
- RMB rmb();
- cout << rmb << endl;
- rmb = ;
- cout << rmb << endl;
- cout << ++(++rmb) << endl;
- cout << rmb++ << endl;
- cout << rmb << endl;
- rmb = ;
- cout << *rmb << endl;
- rmb = *rmb;
- cout << rmb << endl;
- rmb = ;
- cout << rmb/ << endl;
- cout << RMB(rmb/) << endl;
- cout << rmb << endl;
- rmb = ;
- rmb = rmb*rmb;
- cout << rmb << endl;
- cout << ((rmb > )? "" : "不") << "大于80分" << endl;
- return ;
- }
- /*
- ¥123元4角5分
- ¥1元0角0分
- ¥1元0角2分
- ¥1元0角2分
- ¥1元0角3分
- 200
- ¥2元0角0分
- 50
- ¥0元5角0分
- ¥1元0角0分
- ¥1元2角1分
- 大于80分
- */
解析:
至上而下分析(从main函数),用12345初始化RMB类型对象rmb,然后输出rmb,显然第一行输出“¥123元4角5分”,往下走rmb=100,这个操作是赋值操作,我们先往上看看有没有重载赋值运算符函数,发现好像并没有哦,这时候系统会找一找int类里面有没有类型转换构造函数把int转为RMB类型(显然没有嘛,因为RMB是我们自定义的数据类型),而到了这时候呢,系统为了完成类型转换的工作,会直接调用我们的构造函数,将100作为参数传到构造函数里,“相当于”完成了一个类型转换的工作。好了,现在100已经是个RMB对象了,两边对象类型相同,赋值。我们说了,由于没有重载赋值运算符,所以系统会默认将拷贝构造函数作为赋值运算符函数,往上一看,拷贝构造函数也没定义,所以这个调用的是系统隐式定义的浅拷贝构造函数,完成赋值操作。往下走,输出rmb对象,“ ¥1元0角0分”,调用前增量运算符函数,上面重载了,是引用返回,所以两次增量之后还是rmb对象,那么应该按照该对象的输出函数进行输出,也就是“ ¥1元0角2分 ”,下一步调用后增量运算符函数,上面也重载过了,是值返回,返回的是RMB类型的无名变量,对其输出,按照RMB类型的输出函数输出,“ ¥1元0角2分”。后面输出rmb对象,自然是“¥1元0角3分”,下一步又让rmb=100,这里rmb还是RMB类型的,输出2*rmb,由于int类里面没有定义类型转换函数把int转为RMB类型,而RMB类里面定义了把RMB类转为int类型的函数,所以系统会直接调用这个转换函数,把rmb转换为int类型,所以结果应该是int型的,输出的就是int,“200”,然后下一句rmb=2*rmb,刚才解释过,2*rmb得到的是个整数200,其实这句话就相当于rmb=200,前面又说过这句话相当于直接调用RMB的构造函数,那这就很明显了嘛。输出rmb对象,按照RMB类型输出函数进行输出,“ ¥2元0角0分 ”。下一句rmb=100不用解释了,输出rmb/2一样的,把rmb转换为整数,然后输出int“ 50”,下一句相当于输出RMB(50),按照RMB类型输出函数进行输出,“ ¥0元5角0分”,然后输出rmb,rmb并没变嘛,“ ¥1元0角0分 ”,rmb=11,让后是rmb = rmb*rmb,先看看有没有重载*运算符函数,没有,而*在int中有定义,刚好RMB类定义了强制转换为int的函数,那么系统就帮我们调用类型转换函数将两者都转为int,相乘,得到int 121,然后将121赋值给RMB类型rmb对象,然后输出“ ¥1元2角1分”。最后比较,也是转换为int比较,输出“ 大于80分”。
3.冒号语法补充一点
冒号语法的出现是为了解决在构造函数执行时要用到成员类时没有初始化的问题,使用冒号语法即在构造函数后面加上冒号,写上成员类的初始化,这与直接在构造函数里赋值是不一样的,在构造函数之前完成的是初始化而不是赋值。要注意的是,其后成员初始化顺序与其书写顺序是无关的。这句话的解释是,与你声明的顺序有关,举个例子吧。
- class A{
- public:
- A():c(5.6),b(){
- xxx
- }
- private:
- int b;
- double c;
- };
这段代码并不先初始化c,而是先初始化b,因为下面先声明的b。
好的,那么还有个问题,看下面的代码:
- class A{
- public:
- A(int n=0){
- a = n;
- }
- private:
- int a;
- };
- class B{
- public:
- B(int n=0){
- b = n;
- }
- private:
- int b;
- };
- class C{
- public:
- A():aa(){
- //do nothing
- }
- private:
- A aa;
- B bb;
- }
C类我们只给aa初始化了值,那么bb呢,其实也初始化了,按照默认参数0初始化的,可以自己实验输出得到结果的。那这样就告诉我们,在C类对象析构的时候,由于先创建的对象应该后析构,所以后析构的是aa,最后才是本类的对象。因为冒号语法就是保证在C类构造函数执行之前进行其他成员的初始化的任务的,因此就算不用冒号语法,系统其实也会隐式地帮我们写A和B类对象的初始化。所以这样析构的顺序就懂了。
[学习笔记] C++ 历年试题解析(三)--小补充的更多相关文章
- [学习笔记] C++ 历年试题解析(二)--程序题
发现程序题也挺有价值的. 顺便记录下来几道. 1.题目 #include <iostream> #include <cstring> using namespace ① std ...
- [学习笔记] C++ 历年试题解析(一)--判断题
少说话.. 程序题链接:https://www.cnblogs.com/aoru45/p/9898691.html 14级试题---选择题 1. 引用在声明时必须对其初始化,以绑定某个已经存在的变量( ...
- python cookbook第三版学习笔记七:python解析csv,json,xml文件
CSV文件读取: Csv文件格式如下:分别有2行三列. 访问代码如下: f=open(r'E:\py_prj\test.csv','rb') f_csv=csv.reader(f) for f in ...
- Android学习笔记之JSON数据解析
转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...
- Deep Learning(深度学习)学习笔记整理系列之(三)
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
- 多线程编程学习笔记——async和await(三)
接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五. 处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...
- 学习笔记:python3,代码。小例子习作(2017)
http://www.cnblogs.com/qq21270/p/7634025.html 学习笔记:python3,一些基本语句(一些基础语法的代码,被挪到这里了) 日期和时间操作 http://b ...
- c++学习笔记之类和对象(三、static静态成员变量和静态成员函数)
一.static静态成员变量 对象的内存中包含了成员变量,不同的对象占用不同的内存,这使得不同对象的成员变量相互独立,它们的值不受其他对象的影响.是有时候我们希望在多个对象之间共享数据,对象 a 改变 ...
- 学习笔记:python3,代码。小例子习作
http://www.cnblogs.com/qq21270/p/7634025.html 学习笔记:python3,一些基本语句(一些基础语法的代码,被挪到这里了) 日期和时间操作 http://b ...
随机推荐
- cassandra的命令
cassandra的命令: connect <hostname>/<port> (<username> '<password>')?; Conne ...
- 教妹学 Java:晦涩难懂的泛型
00.故事的起源 “二哥,要不我上大学的时候也学习编程吧?”有一天,三妹突发奇想地问我. “你确定要做一名程序媛吗?” “我觉得女生做程序员,有着天大的优势,尤其是我这种长相甜美的.”三妹开始认真了起 ...
- c#实现最简快速排序,你绝对可以看懂
原创文章,转载请注明出处 算法对于程序员的重要性不言而喻,今天我和大家分享算法中的一个基础算法,快速排序.作为一名程序员,相信大家都不陌生,但是要大家徒手一次性写出来,我估计还是有难度的.那么废话不多 ...
- tidb 安装deploy-ntp.yml失败,什么原因?
在同步时间服务的时候报错,信息如下.实际上我配置的时间服务器的IP就是如下的10.188.100.103,在 执行$ansible-playbook -i hosts.ini deploy_ntp.y ...
- UE4中资源加载资源的方式
在UNITY中,我们加载资源一般是通过Resources.Load(path).即可完成.该方法返回的是Object类型.如果你想要的是材质或者贴图等等,只要价格类型转换的关键字就可以了例如 as M ...
- react-native-contact 安卓已测试,
1. 下载模块 npm install react-native-contacts --save 2.安卓配置: a.在android/settings.gradle include ':rea ...
- 洛谷P2136 拉近距离
题目背景 我是源点,你是终点.我们之间有负权环. --小明 题目描述 在小明和小红的生活中,有\(N\)个关键的节点.有\(M\)个事件,记为一个三元组\((S_i,T_i,W_i)\),表示从节点\ ...
- npm ERR! missing script: build
webpack-bundle-analyzer webpack可视化插件,用来查看一共打了多少个包,每个包的体积和包里面的情况. 启动查看 npm run build --report 结果报错npm ...
- MySQL表完整性约束
=======MySQL表完整性约束====== 目录: 一.介绍 二.not null 与 default 三.unique 四.primary key 五.auto_increment 六.for ...
- php数组生成树结构数据返回
现在有这样一个数组,要求按照树结构返回(当pid=0就表示其为菜单id,否则pid的值就是其属于某个菜单id下面): $array = array( 1 => array ('id' => ...