《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的更多相关文章

  1. 《C++ primer》学习笔记整理

    简介 本笔记目前已包含<C++ Primer>中的绝大部分内容,但尚有部分小节有所缺漏,如 19.1.19.2 节的笔记尚未整理,会持续更新. 本项目中的学习笔记是在学完一章内容后,对其要 ...

  2. C Primer Plus 学习笔记 -- 前六章

    记录自己学习C Primer Plus的学习笔记 第一章 C语言高效在于C语言通常是汇编语言才具有的微调控能力设计的一系列内部指令 C不是面向对象编程 编译器把源代码转化成中间代码,链接器把中间代码和 ...

  3. 《C++ Primer》学习笔记 :命名空间的using声明

    最近在学C++,在<C++ Primer>第五版的3.1节中说到使用using声明来使用命名空间中的成员,<C++ Primer>中这样写道: 有了using声明就无须专门的前 ...

  4. 《C++ Primer》学习笔记:迭代器介绍

    <C++Primer>(第五版)中,3.4.1的例题中使用一个名为text的字符串向量存放文本文件中的数据,输出text中的内容,刚开始我这样写: #include <iostrea ...

  5. 《C++ Primer》学习笔记:3.3.3其他vector操作

    <C++ Primer>(第五版)中计算vector对象中的索引这一小节中,举例要求计算各个分数段各有多少个成绩. 代码如下: #include <iostream> #inc ...

  6. 《C++ Primer》学习笔记:向vector对象添加元素蕴含的编程假定

    练习<C++ Primer>中的3.14节时,当敲入: #include <iostream> #include <string> using namespace ...

  7. 《C++ Primer》学习笔记【第三部分 类设计者的工具】

    第13章 拷贝控制 使用default:=defult只能修饰默认构造函数或拷贝控制成员,显式地要去编译器生成合成的版本. 使用delete:=delete通知编译器不希望定义这些成员,禁止试图使用它 ...

  8. 《C++ Primer》学习笔记【第二部分 C++标准库】

    第8章 IO库 IO对象不能复制,即1.IO对象不能存储在vector或其他容器中   2.如果需要传递或返回IO对象,必须传递或返回指向该对象的指针或引用. 一般情况下,如果要传递IO对象以便对它进 ...

  9. 《C++ Primer》学习笔记【第一部分 C++基础】

    第2章  整型的赋值:当我们试着把一个超出其范围的值赋给一个指定类型的对象时,结果如何?答案取决于类型是signed还是unsigned的.对于unsigned,编译器会将该值对unsigned类型的 ...

  10. C Primer Plus学习笔记(二)

    1. C的左值用是指用于标志一个特定的数据对象的名字或表达式.“数据对象”是泛指数据存储的术语. 赋值运算符的左边应该是以个可以修改的左值. 右值是指可赋给可修gia的左值的量.右值可以是常量.变量或 ...

随机推荐

  1. String中indexof函数的用法

    int indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引. int indexOf(int ch, int fromIndex) 从指定的索引开始搜索,返回在此字符串中第一次 ...

  2. 《linux设备驱动开发详解》笔记——6字符设备驱动

    6.1 字符设备驱动结构 先看看字符设备驱动的架构: 6.1.1 cdev cdev结构体是字符设备的核心数据结构,用于描述一个字符设备,cdev定义如下: #include <linux/cd ...

  3. Python的第3堂课

    20181119笔记 一.内存管理相关 ①Cpython解释器的垃圾回收机制 什么是垃圾:当一个值没有被绑定任何变量名(即该值的引用计数为零时),该值就是垃圾. 垃圾回收是收回值占用的内存空间. 引用 ...

  4. Java-在一个包装器对象中包装一个原始类型

    使用基本类型的包装对象,好处可以为空且可以序列化 package com.tj; public class MyClass2 { public static void main(String[] ar ...

  5. 【11】specified value,computed value,used value计算方法

    [11]specified value,computed value,used value计算方法 specified value(规范值): 计算方法如下: 如果样式表设置了一个值,使用这个值 如果 ...

  6. idea中代码费格式化 ctrl+alt+L

    idea中代码费格式化   ctrl+alt+L

  7. 指定字符串 s,返回 s 所有可能的子串,每个子串必须是一个回文(指顺读和倒读都一样的字符串)

    Given a string s, partition s such that every substring of the partition is a palindrome Return all ...

  8. matlab中函数学习——11月14日

    1.记录数组元素个数函数:numel() 解释:number of array 相当于 prod(size(A)) 2.添加路径: addpath('.\3rdparty\ksvd'); 3.pada ...

  9. ubuntu14.04:php7+apache2+mysql

    apache2: sudo apt-get install apache2 apache2-dev service apache2 start mysql: sudo apt-get install ...

  10. tomcat404

    确认目录下有我的html文件,但仍然是404. 问题一: 指定目录下没有访问的文件,这是最常见的,也是最容易解决的.只需要将访问的文件(如:a.html)放到指定目录下即可. 问题二: 将访问的文件( ...