C++ Primer Plus 第15章 友元、异常和其他

第15章 友元、异常和其他

1.友元不仅有友元函数,还能是友元类

还可以将类中的某一个成员函数指定为另一个类的友元

尽管友元被授予从外部访问私有部门的权限,单并不与面向对象编程思想相愽,相反,它们提高了公有接口的灵活性

2.类的成员函数作为其他类的友元,涉及到类的声明顺序。

还有一个函数作为两个类的友元

这方面内容看P607-611

3.嵌套类:在另一个类中声明的类被称为嵌套类

类嵌套与包含不一样。包含意味着将一个类对象作为另一个类的成员,而对类进行嵌套不创建类成员,而是定义了一种类型。

4.对类进行嵌套通常是为了帮助实现另一个类,并避免名称冲突。

5.嵌套类,结构和枚举在类中声明的作用域特征

声明位置  包含它的类是否可以使用它  从包含它的类派生而来的类是否可以使用它 在外部是否可以使用

私有部分           是                             否                             否

保护部分           是                             是                             否

公有部分           是                             是                             是,通过类限定符来使用

6.模板很适合作为嵌套类的定义

7.异常

调用std::abort()将会向标准错误流发送消息,然后终止程序

8异常机制

异常提供了将控制权从程序的一个部分传递到另一部分的途径

引发异常

使用处理程序捕获异常

使用try块

9.throw实际上是跳转。表示引发异常,紧接其后的值(如字符串或对象)指出了异常的特征

10.catch关键字表示捕获异常,随后位于括号中是类型声明,指出了要响应的异常类型

11.引发异常的函数将传递一个对象。这样的优点是使用不同的异常类型来区分不同的函数在不同的情况下引发的异常

12.异常规范 例子

double harm(double a)throw(bad_thing);     表示只会抛出bad_thing类型的异常

double marm(double) throw();   表示不会抛出异常

出现在函数原型和函数定义中,可包含类型列表,也可不包含

13.异常出现会栈解退,直到遇到第一个try块,过程中自动变量会释放,动态变量也会被调用析构函数

14.引发异常是编译器总是创建一个临时拷贝,这样子catch块的类型使用引用。好处是基类引用可以获取子类出来的异常

15如果有一个异常类继承层次结构,应该这样排列catch块:将捕获位于层次结构最下面的异常类的catch

语句放在最前面,将捕捉基类异常的catch语句放在最后面

16.有一些标准的异常类P632

17.对未捕获异常和意外异常进行处理P639-P642

18.RTTI 运行阶段类型识别(Runtime Type Identification)

RTTI只适用于包含虚函数的类

19.dynamic_cast运算符 不能回答“指针指向的是哪类对象”,但能够“是否可以安全地将对象的地址赋给特定类型的指针”

如Super * pm = dynamic_cast<Super*>(pg)

指针pg的类型是否可以安全地转换成Super*.可以,则返回对象的地址,否则返回一个空指针

通用  Type* pm = dynamic_cast<Type*>(pt)

20.typeid运算符和type_info类。

typeid可以接受两种参数:类名;结果为对象的表达式

typeid返回一个type_info对象的引用。

通过type_info的重载运算符 == 和 != 可以对类型进行比较

如typeid(Magnificent) == typeid(*pg)

检查pg指向的对象类型是否是Magnificent

P647

21.类型转换运算符

4个类型转换运算符

dynamic_cast<type-name>(expression) 判断expression能否转换成type-name

const_cast<type-name>(expression)  将类型中的const属性去掉

static_cast<type-name>(expression) type-name和expression两者可以隐式转换时,就合法。包括基类转换成子类的指针或引用

reinterpret_cast<type-name>(expression) 是不做任何处理,将内存字节拷贝的方法。有一些限制,查看P652

15.8编程练习 有时间做

C++ Primer Plus 第15章 友元、异常和其他,布布扣,bubuko.com

时间: 2024-10-10 17:02:10

C++ Primer Plus 第15章 友元、异常和其他的相关文章

《C++ Primer Plus》第15章 友元、异常和其他 学习笔记

友元使得能够为类开发更灵活的接口.类可以将其他函数.其他类和其他类的成员函数作为友元.在某些情况下,可能需要前向声明,需要特别注意类和方法声明的顺序,以正确地组合友元.潜逃类是在其他类中生命的类,它有助于设计这样的助手类,即实现其他类,单必须是共有接口的组成部分.C++机场机制为处理拙劣的编程事件,如不适当的I/O失败等,提供了一种灵活的方式.引发异常将终止当前值性的函数,将控制权传给匹配的catch块.catch块紧跟在try块的后面,为捕获异常,直接或间接导致异常的函数调用必须为与try块中

《C++Primer》14、15章

第14章 重载运算符与类型转换 14.1 基本概念 只有当操作的含义对于用户来说清晰明了时才使用运算符. 选择作为成员还是非成员? 赋值.下标.调用和成员访问运算符必须是成员. 复合赋值运算符一般是成员. 改变对象状态或者与给定类型密切相关的,如递增.解引用通常是成员. 具有对称性的运算符可能转换任意一端元素的运算对象,例如算数.相等.关系和位运算等,通常是非成员函数. 14.2 输入输出运算符(略) 14.3 算术与关系运算符(略) 14.4 赋值运算符(略) 14.5 下标运算符 通常会定义

C++ Primer学习总结 第15章 面向对象程序设计

第15章 面向对象程序设计 1.    构造基类和派生类. 其中A类是基类,B类是派生类.派生类的构造函数必须重新写过,不能继承.(因为毕竟两个类的类名都不一样,不可能构造函数继承)只继承其他的成员函数和成员变量. 派生类可以覆盖基类的虚函数,但是也可以选择不覆盖(即直接使用父类的函数版本)比例A类的print_1()虚函数就没有被覆盖. 基类的静态成员:如果基类有一个静态成员,那么基类和所有派生类都共同拥有这仅有的一个静态成员. 2.    基类的虚函数默认实参最好与派生类的虚函数默认实参一致

《C++ Primer》 chapter 15 TextQuery

<C++ Primer>中第15章为了讲解面向对象编程,举了一个例子:设计一个小程序,能够处理查询给定word在文件中所在行的任务,并且能够处理“非”查询,“或”查询,“与”查询.例如执行查询 one & of |the ,表示对单词one和of的查询结果取交集,然后对单词the的查询结果取并集. 书中查询的底层操作实际定义在类TextQuery中,我们在TextQuery的基础上,进一步封装并实现如下图所示的类结构,能够达到上述功能需求.类之间的结构如下图所示: 程序扼要设计如下表所

C++ Primer Plus 第17章 输入,输出和文件

第17章 输入.输出和文件 1.当到达输入语句时,他将刷新输出缓冲区中当前所有的输出 2.streambuf类 提供了对缓冲区的各种操作 ios_base类表示流的一般特征 ios类基于ios_base,包含了一个指向streambuf对象的指针 ostream类从ios派生,提供可输出方法 istream类从ios派生,提供可输入方法 iostream类基于ostream和istream,继承了输入和输出方法 3.包含iostream则自动创建了8个流对象 cin 标准输入 wcin 宽字符流

java第15章示例代码

import java.util.Scanner; /** * * @author asus第15章示例代码1 全桂群2017.4.9 * */public class Registter { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); String uname, pw

第15章 就不能换DB吗?—抽象工厂模式

由于抽象工厂在我们编程当中经常使用和常见,所有本篇文章对<大话设计模式>中的15章做了很详细的比较.通过一个Dao层可以更换访问任意数据库的例子来学习抽象工厂模式.例如:Dao层可以访问Sqlserver数据库,也可以访问Access数据库,当程序新增访问Oracle数据库时,无需修改现有代码,只需要添加访问Oracle相关的类就可以,实现了开闭原则.本篇文章的例子中每种数据库上都有User和Department表,我们Dao层对这两个表进行查询和插入操作. 最基本数据库访问 一下是访问Sql

C Primer Plus (第四章总结)

1.定义字符串可以直接在头文件下定义,如: #include <stdio.h> #define hello  "hello world!" 2.sizeof() 和 strlen() sizeof运算符是以字节为单位给出数据的大小,strlen()是以字符为单位给出长度. <string.h>包含许多与字符串相关的函数的原型,包括strlen() sizeof运算符提供的数据比肉眼直观的要大多一位,因为他把用来标志字符串的不可见的空字符也计算在内. 定义常量最

《白帽子讲WEB安全》学习笔记之第15章 web server配置安全

第15章 web server配置安全 15.1 apache安全 在linux部署安装web Server时候一定主要要使用"最小权限原则".尽量不要使用root部署. 15.2 nginx安全 Nginx 安全配置指南技术手册 PDF 下载 免费下载地址在http://linux.linuxidc.com/ 用户名与密码都是www.linuxidc.com 具体下载目录在 /pub/服务器相关教程/Nginx/Nginx 安全配置指南技术手册/ 参考资料:http://my.osc