《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的左值的量.右值可以是常量.变量或 ...
随机推荐
- redis 散列学习要点记录
散列类型键值也是种字典结构,存储了字段和字段值的映射,字段值只能是字符串,不可以是其他类型(redis数据类型都不可嵌套使用其他类型),散列类型键可以有2的32次方减1个字段 散列的命令组 hset ...
- Java并发编程的艺术 记录(一)
模拟死锁 package com.gjjun.concurrent; /** * 模拟死锁,来源于<Java并发编程的艺术> * @Author gjjun * @Create 2018/ ...
- python中strip(),lstrip(),rstrip()函数的讲解
1. strip() 它的函数原型:string.strip(s[, chars]),它返回的是字符串的副本,并删除前导和后缀字符.(意思就是你想去掉字符串里面的哪些字符,那么你就把这些字符当参数传入 ...
- IDEA避免JAVA文件自动引入import.*包
Intellij Idea工具在java文件中怎么避免import java.utils.*这样的导入方式,不推崇导入*这样的做法!Editor->Code Style->Java-> ...
- Java-在JVM关闭前调用的函数
参考:http://qtlkw.iteye.com/blog/1018872 package com.tj; import java.text.SimpleDateFormat; import jav ...
- 【04】图解JSON
[04]图解JSON 附件列表
- 【LeetCode】Remove Nth Node From End of List(删除链表的倒数第N个节点)
这道题是LeetCode里的第19道题. 题目要求: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, ...
- SPOJ - ADAFIELD ,Set+map,STL不会超时!
ADAFIELD - Ada and Field 这个题,如果用一个字来形容的话:-----------------------------------------------嗯! 题意:n*m的空白 ...
- POJ-1696 Space Ant 凸包版花式水过!
Space Ant 明天早上最后一科毛概了,竟然毫无复习之意,沉迷刷题无法自拔~~ 题意:说实 ...
- NOJ——1628Alex’s Game(III)(DFS+回溯)
[1628] Alex’s Game(III) 时间限制: 1000 ms 内存限制: 65535 K 问题描述 Alex likes to play with one and zero as you ...