小小的补充一下吧,因为李老师又把直招的卷子发出来了。。

题目

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++ 历年试题解析(三)--小补充的更多相关文章

  1. [学习笔记] C++ 历年试题解析(二)--程序题

    发现程序题也挺有价值的. 顺便记录下来几道. 1.题目 #include <iostream> #include <cstring> using namespace ① std ...

  2. [学习笔记] C++ 历年试题解析(一)--判断题

    少说话.. 程序题链接:https://www.cnblogs.com/aoru45/p/9898691.html 14级试题---选择题 1. 引用在声明时必须对其初始化,以绑定某个已经存在的变量( ...

  3. 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 ...

  4. Android学习笔记之JSON数据解析

    转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...

  5. Deep Learning(深度学习)学习笔记整理系列之(三)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  6. 多线程编程学习笔记——async和await(三)

    接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五.   处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...

  7. 学习笔记:python3,代码。小例子习作(2017)

    http://www.cnblogs.com/qq21270/p/7634025.html 学习笔记:python3,一些基本语句(一些基础语法的代码,被挪到这里了) 日期和时间操作 http://b ...

  8. c++学习笔记之类和对象(三、static静态成员变量和静态成员函数)

    一.static静态成员变量 对象的内存中包含了成员变量,不同的对象占用不同的内存,这使得不同对象的成员变量相互独立,它们的值不受其他对象的影响.是有时候我们希望在多个对象之间共享数据,对象 a 改变 ...

  9. 学习笔记:python3,代码。小例子习作

    http://www.cnblogs.com/qq21270/p/7634025.html 学习笔记:python3,一些基本语句(一些基础语法的代码,被挪到这里了) 日期和时间操作 http://b ...

随机推荐

  1. Django 的 之 视图

    Django的View(视图) 一个视图函数(类),简称视图, 是个简单的python函数(类),它接受wed请求并且返回web 响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...

  2. 51Nod - 1640 天气晴朗的魔法 大+小生成树(最大值最小)/二分

    天气晴朗的魔法 这样阴沉的天气持续下去,我们不免担心起他的健康.   51nod魔法学校近日开展了主题为“天气晴朗”的魔法交流活动.   N名魔法师按阵法站好,之后选取N - 1条魔法链将所有魔法师的 ...

  3. sql生成一个唯一标示

    IDNEWID() 插入一条: insert into W_1(id,account,password,uname,telnumber,imei) values(NEWID(),’xiaohong’, ...

  4. 程序员必备,C#各类项目、开源项目插件资料收藏

    一.AOP框架     Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种部署方面 ...

  5. 线性Softmax分类器实战

    1 概述 基础的理论知识参考线性SVM与Softmax分类器. 代码实现环境:python3 2 数据预处理 2.1 加载数据 将原始数据集放入"data/cifar10/"文件夹 ...

  6. wordcount作业

    搭档:201631062427,201631062627 代码地址:https://gitee.com/oyyyyyy/wordcount 作业地址: 一: 代码互审情况 我们采用的都是c语言的方式完 ...

  7. ugui获取text宽

    http://www.xuanyusong.com/archives/3587 void Start () { Font font = Resources.Load<Font>(" ...

  8. 2014 Noip提高组 Day2

    P2038 无线网络发射器选址 [题目描述] 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 ...

  9. Sublime Text 3 配置 sass

    先安装Sublime Text的sass 和 sass build插件, Sublime Text新建一个test.scss文件 $color: #369;  body {     backgroun ...

  10. 基于角色权限管理:rbac设计分析以及具体细节

    权限管理---设计分析以及具体细节 说起权限我们大家都知道,不一样的角色会有不一样的权限. 比如就像学生管理系统一样,管理员,老师,学生之间的权限都是不一样的,那么展示的页面也是不一样的. 所以,我们 ...