《C++ Primer Plus》学习笔记9
《C++ Primer Plus》学习笔记9
第15章 友元、异常和其他
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
主要内容:
1)友元类
2)友元类方法
3)嵌套类
4)引发异常、try块和catch块
5)异常类
6)执行阶段类型识别(RTTI)
7)dynamic_cast和typeid
8)static_cast、const_cast和reiterpret_cast
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
1、对于Remote对象的TV方法。其原型可在Remote类声明之前声明,但必须在Remote类声明之后定义。以便编译器有足够的信息来编译该方法。
class Tv
{
friend class Remote;
public:
void buzz(Remote & r);
……
};
class Remote
{
friend class Tv:
public:
void Bool volup(Tv & t)
{
t.volup();
}
};
inline void Tv::buzz(Remote & r)
{
……
}
因为Remote的声明位于Tv声明的后面,所以能够在类声明中定义Remote::volup()。可是Tv::buzz方法必须在Tv声明的外部定义,使其位于Remote声明的后面。
共同的友元
须要使用友元的还有一种情况是,函数须要訪问两个类的私有数据,从逻辑上看,这种函数应是每一个类的成员函数。但这是不可能的,它能够是一个类的成员,同一时候是还有一个类的友元,只是有时将函数作为两个类的友元更加合理。
补充:友元使得可以为类开发更灵活的接口
2、嵌套类
在C++中,能够将类声明放在还有一个类中,在还有一个类中声明的类被称为嵌套类(nested class)。它通过提供新的类型类作用域来避免名称的混乱。
对类进行嵌套一般是为了帮助实现还有一个类。避免名称冲突。
补充:嵌套类是在其它类中声明的类,它有助于设计这种助手类。即实现其它类。但不必是公有接口的组成部分。
class Queue
{
//class scope definitions
//Node is a nested structure definition local to this class
struct Node
{
Item item;
struct Node * nest;
};
}
Node实际上是一个嵌套类。
1)嵌套类的作用域
假设嵌套类是私有部分声明的,则仅仅有后者知道它。前面Node类就是这样的情况。由于类的默认訪问权限是私有的;对于包括它的类是能够使用它;从包括它的类派生而来的类不能使用。外部世界也不能使用它。
假设嵌套类是保护分声明的。则仅仅有后者知道它。对于包括它的类是能够使用它;从包括它的类派生而来的类能使用。外部世界也不能使用它。
假设嵌套类是公部分声明的,对于包括它的类是能够使用它;从包括它的类派生而来的类能使用,外部世界也能使用它。
嵌套结构和枚举的作用域与这个同样。
3、异常
1)调用abort
处理方式,假设当中一个參数是还有一个參数的负值。则调用abort()函数
其典型实现是向标准错误流发送消息abnormal program termination(程序异常终止)
2)返回错误码
一种比异常终止更加灵活的方法是使用函数的返回值来指出问题。
3)异常机制
对于异常处理有三个组成部分
①引发异常
throw语句实际上是跳转。keyword表示引发异常,紧跟其后的值指出了异常的特征
②捕获有处理程序的异常
catchkeyword表示捕获异常
③使用try块
try块标识当中特定的异常可能被激活的代码块,它后面跟一个或多个catch块
补充:C++异常机制为处理拙劣的编程事件,如不适合的值,I/O失败等,提供了一种灵活的方式,引发异常将终止当前运行的函数。将控制权传给匹配的catch块。catch块紧跟在try块中的代码。
4、RTTI
RTTI是执行阶段类型识别
RTTI特性让程序可以检測对象的类型。dynamic_cast操作符用于将派生类指针转换为基类指针。其主要用途是确保可以安全的调用虚函数。
RTTI的工作原理:
C++有3个支持的RTTI的元素,
假设可能的话,dynamic_cast操作符将使用一个指向基类的指针来生成一个指向派生类的指针,否则,该操作符返回0——空指针。
typeid操作符返回一个指出对象的类型的值
type_info结构存储了有关特定类型的信息
RTTI仅仅适用于包括虚函数的类。
通常,假设指向的对象(*pt)的类型是Type或者是从Type直接或间接派生而来的类型。则表达式:dynamic_cast<Type *>(pt)将指针pt转换为Type类型的指针;否则。结果为0.即空指针。
《C++ Primer Plus》学习笔记9的更多相关文章
- 《C++ primer》学习笔记整理
简介 本笔记目前已包含<C++ Primer>中的绝大部分内容,但尚有部分小节有所缺漏,如 19.1.19.2 节的笔记尚未整理,会持续更新. 本项目中的学习笔记是在学完一章内容后,对其要 ...
- C Primer Plus 学习笔记 -- 前六章
记录自己学习C Primer Plus的学习笔记 第一章 C语言高效在于C语言通常是汇编语言才具有的微调控能力设计的一系列内部指令 C不是面向对象编程 编译器把源代码转化成中间代码,链接器把中间代码和 ...
- 《C++ Primer》学习笔记 :命名空间的using声明
最近在学C++,在<C++ Primer>第五版的3.1节中说到使用using声明来使用命名空间中的成员,<C++ Primer>中这样写道: 有了using声明就无须专门的前 ...
- 《C++ Primer》学习笔记:迭代器介绍
<C++Primer>(第五版)中,3.4.1的例题中使用一个名为text的字符串向量存放文本文件中的数据,输出text中的内容,刚开始我这样写: #include <iostrea ...
- 《C++ Primer》学习笔记:3.3.3其他vector操作
<C++ Primer>(第五版)中计算vector对象中的索引这一小节中,举例要求计算各个分数段各有多少个成绩. 代码如下: #include <iostream> #inc ...
- 《C++ Primer》学习笔记:向vector对象添加元素蕴含的编程假定
练习<C++ Primer>中的3.14节时,当敲入: #include <iostream> #include <string> using namespace ...
- 《C++ Primer》学习笔记【第三部分 类设计者的工具】
第13章 拷贝控制 使用default:=defult只能修饰默认构造函数或拷贝控制成员,显式地要去编译器生成合成的版本. 使用delete:=delete通知编译器不希望定义这些成员,禁止试图使用它 ...
- 《C++ Primer》学习笔记【第二部分 C++标准库】
第8章 IO库 IO对象不能复制,即1.IO对象不能存储在vector或其他容器中 2.如果需要传递或返回IO对象,必须传递或返回指向该对象的指针或引用. 一般情况下,如果要传递IO对象以便对它进 ...
- 《C++ Primer》学习笔记【第一部分 C++基础】
第2章 整型的赋值:当我们试着把一个超出其范围的值赋给一个指定类型的对象时,结果如何?答案取决于类型是signed还是unsigned的.对于unsigned,编译器会将该值对unsigned类型的 ...
- C Primer Plus学习笔记(二)
1. C的左值用是指用于标志一个特定的数据对象的名字或表达式.“数据对象”是泛指数据存储的术语. 赋值运算符的左边应该是以个可以修改的左值. 右值是指可赋给可修gia的左值的量.右值可以是常量.变量或 ...
随机推荐
- IE6,7,8,9还有火狐浏览器的兼容
/*FF.Opear等支持Web标准的浏览器*/#header { margin-top: 23px; margin-bottom: 23px;}/*IE6浏览器*/*ht ...
- AHB2reg接口转换
assign mcu_xxx_addr = (rd_after_wr_reg || reg_valid_write_trans) ? haddr_reg[ADDR_WIDTH+:] : haddr[A ...
- laravel富文本编辑和图片上传
---恢复内容开始--- 首先先找到一个适合的编辑器是胜利的一步,选择wangEditor这个编辑器 地址:http://www.wangeditor.com/ 然后选择下载,我是通过网上学习的,所以 ...
- python datetime,time时间格式和用法
我是转载的这个大神的 他的网址:https://www.cnblogs.com/wanglinjie/p/9226926.html #以下是time的方法 >>> import ...
- android sdk 下载
不知道是因为最近kaihui还是怎么的,打开android sdk官方网站特别的慢,想下载最新版本的platform几乎变成不可能完成的任务,不知道为什么Google不像Apache那样在各国设立镜像 ...
- C#上位机开发(二)—— Hello,World
上一篇大致了解了一下单片机实际项目开发中上位机开发部分的内容以及VS下载与安装,按照编程惯例,接下来就是“Hello,World!” 1.新建C#项目工程 首先选择新建Windows窗体应用(.NET ...
- [BZOJ2287]【POJ Challenge】消失之物(DP)
传送门 f[i][j]表示前i个物品,容量为j的方案数c[i][j]表示不选第i个物品,容量为j的方案数两个数组都可以压缩到一维 那么f[i][j] = f[i - 1][j] + f[i - 1][ ...
- 洛谷P3327 - [SDOI2015]约数个数和
Portal Description 共\(T(T\leq5\times10^4)\)组数据.给出\(n,m(n,m\leq5\times10^4)\),求\[\sum_{i=1}^n\sum_{j= ...
- 刷题总结——魔法森林(bzoj3669)
题目: Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同 ...
- ngrinder的安装
1.官网下载war包(ngrinder-controller),可以使用tomcat启动或者直接nohup java -XX:Permsize=200m -jar ngrinder-3.4.1.war ...