[学习笔记] 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 ...
随机推荐
- 符号分割的字符串转换为XML
把某一符串分割的字符串转换为 XML格式: DECLARE @str NVARCHAR(MAX) = N'fd,re,45,tyu,976,qwer,gdsg,uyt' DECLARE @xml XM ...
- python_文件目录的操作
Python文件的主要操作 主要包括: 1,创建一个文件 2,删除一个文件 3,创建一个目录 4,删除一个目录 5,拷贝,重命名,查看文件大小 6,列出某个目录下文件的数量 7,递归打印某个目录下的所 ...
- 【转】Js 数组转JSON格式
要点1:转化函数 JSON.stringify() 要点2:在js里写数组的时候是var data = new Array() 但是你如果是要转json显示的时候就要写成 var data = {}, ...
- hihoweek 137(简单完全背包)
题目链接:http://hihocoder.com/contest/hiho137/problem/1 题意:中文题诶- 思路:各层的成本计算不会有影响,所以我们只要把没一层的成本计算出来在求和就是答 ...
- JDBC基础原理
一.DCL(了解) -- 1. 创建用户CREATE USER 'zhangsan'@'%' IDENTIFIED BY 'zhangsan';-- 2. 用户授权GRANT ALL ON heima ...
- JS高级学习历程-7
[面向(基于)对象] 1 创建对象 在php里边,需要先找到一个类别,在通过类创建具体对象 在javascript里边,可以直接创建具体对象,后期可以再给对象丰富许多属性或方法. 1. 字面量方式创建 ...
- Spring注入bean和aop的注意事项
spring注入类没有构造函数,注入成功抽象类,注入失败不写bean注入的名字,默认是bean第一个字母小写的名字,但是bean名字开头是两个大写,则默认是bean的名字前面所有大写都变小写@Auto ...
- SpringMVC对HTTP报文体的处理
客户端和服务端HTTP报文传递消息,而HTTP报文包含报文头和报文体.通常,解析请求参数以及返回页面都不需要我们关心HTTP报文体的读取和生成过程.但在某些特定场景下需要直接到请求报文中读取报文体, ...
- 常用的http网页错误代码表---------495引发的一个简单到爆,但基于国内环境只能呵呵呵的血案
敲代码敲出了个网页错误代码 495. 然后,正常的跑去百度,看了一堆还是没有完整的网页错误代码,应该说国内的环境的网页错误代码表只有官方的那几个,那么只能FQ了. 去到谷歌,一查全是俄语,乐了,明白是 ...
- EF 记录执行的sql语句
最近做了个中等的项目,数据不会很多,开发时间比较紧迫,所以用了EF的框架. 在使用过程中,发现有时候执行的结果不如预期,想看看执行的sql语句为何,遍查找资料,在网上找到了相关辅助类,拿来使用,部署到 ...