【C++ Primer】第十五章 友元、异常和其他 --之二--->异常

原创 2012年04月07日 22:28:53

一,运行阶段错误

        1)程序打开一个不可用的文件

        2)请求过多的内存

        3)遭遇不能容忍的值

二,调用abort()  异常终止一个进程  #include <stdlib.h>

       流程: 1)向标准错误流发送消息 abnormal program termination

                   2)终止程序

                   3)返回一个随实现而异的值,告诉OS或父进程,处理失败

        

#include <cstdlib>
int main()
{
	abort();
	return 0;
}

三,异常机制

        1)例子:

#include <iostream>
using namespace std;
double hmean(double a,double b)
{
	if(a == -b)
		throw "bad hmean() a=-b";
	return 2*a*b/(a+b);
}
int main()
{
	double x,y,z;
	cout<<"Enter two numbers: ";
	while(cin>>x>>y)
	{
		try{
			z=hmean(x,y);
		}catch(const char *s){
			
			cout<<s<<endl;
			cout<<"Enter next set of numbers :";
			continue;
		}
		cout<<"Harmonic mean of "<<x<<"  and "<<y<<" is "<<z<<endl;
		cout<<"Enter next pair of numbers: <q to quit>";
	}
	cout<<"Bye!\n";
	return 0;
}


说明:throw 类似于执行返回语句,它终止函数的执行。但throw不是将控制权返回给调用程序,而是导致程序沿函数调用序列后退。直到找到try块的函数。

           2)exception类

                  捕获所有异常:catch(...){ }

                  异常的注意事项:1>使用异常会增加程序代码

                                               2>降低程序的运行速度

                                               3>异常规范不适用于模板,模板引发的异常随特定具体化而异

三,RTTI (runtime type identification) 运行阶段类型识别

       1)含义:程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型

       2)RTTI提供了以下两个非常有用的操作符:

       1)typeid操作符,返回指针和引用所指的实际类型;typeid(a).name()就能知道变量a是什么类型的
       2)dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用。

      3)例子:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
class Grand
{
private:
	int hold;
public:
	Grand(int h=0):hold(h){}
	virtual void speak() const {
		cout<<"I am a grand class!\n";
	}	
	virtual int Value()const{
		return hold;
	}
};
class Superb:public Grand
{
public:
	Superb(int h=0):Grand(h){}
	void speak() const {
		cout<<"I am a super class!\n";
	}
	virtual void say() const{
		cout<<"I hold the superb value of "<<Value()<<"!\n";
	}
	
};
class Magnificent:public Superb
{
private:
	char ch;
public:
	Magnificent(int h=0,char cv='A'):Superb(h),ch(cv){}
	void speak() const {
		cout<<"I am a Magnificent class!\n";
	}
	virtual void say() const{
		cout<<"I hold the character "<<ch<<"and the interger"<<Value()<<"!\n";
	}
	
};
Grand *GetOne()
{
	Grand *p;
	switch(rand()%3)
	{
		case 0:p=new Grand(rand()%100);
			break;
		case 1:p=new Superb(rand()%100);
			break;
		case 2:p=new Magnificent(rand()%100,'A'+rand()%26);
			break;
			
	}
	
	return p;
}

int main()
{
	srand(time(0));
	Grand *pg;
	Superb *ps;
	for(int i=0;i<5;i++)
	{
		pg=GetOne();
		cout<<"Now processing type "<<typeid(*pg).name()<<".\n"; //typeid(*pg).name() 返回的是类名
		pg->speak();
		
		if(ps == dynamic_cast<Superb *> (pg))   //dynamic_cast<Superb *> (pg) 将基类类型的指针或引用安全地转换为派生类型的指针或引用
			ps->say();
		if(typeid(Magnificent) == typeid(*pg))
			cout<<"Yes , you are really magnificent .\n";
	}
	
	return 0;
}
输出:(由于采用随机数,每次运行结果不同)




         

相关文章推荐

《C++ Primer Plus(第六版)》(31)(第十五章 友元、异常和其他 笔记)

友元类,友元类函数,嵌套类,异常,运行时类型识别,type_id,type_info,各种转换 1.友元类,就在类中声明个friend class className;就行了。 这个是对所有成员有效的...

《C++ Primer Plus(第六版)》(32)(第十五章 友元、异常和其他 复习题答案)

15.7 复习题 1.下面建立友元的尝试有什么错误? a. class snap { friend clasp; ... }; class clasp{ ... };b. ...

《C++ primer plus》第十五章:友元、异常与其他 学习笔记

《C++ primer plus》第十五章:友元、异常与其他

【C++ Primer】第十五章 友元、异常和其他 --之一--->友元和嵌套类

一,友元        1)可以将类作为友元,友元类的所有方法都可以访问原始类的私有成员和保护成员。        2)下面例子介绍了 电视类和遥控器类,其中遥控器类为电视类的友元类      ...

C++ Primer Plus学习之友元异常及其他

友元关系        类的友元关系除了函数外,还可以定义友元成员函数,友元类来对相关类进行访问。        而友元声明可以位于公有、私有或者保护部分,其所在的位置无关紧要。        ...

【读书笔记:C++ primer plus 第六版 中文版】第15章 友元、异常和其他

转载请注明出处:本章内容包括: 友元类 友元类方法 嵌套类 引发异常,try块和catch块 异常类 运行阶段类型识别(RTTI) dynamic_cast和typeid static_cast,co...

第15章——友元、异常和其他

l         友元 类并非只能拥有友元函数,也可以将类作为友元 eg: class Tv {        public:               friend class Re...

C++ Primer 学习笔记 — 友元

友元机制允许一个类将对其非公有成员的访问权授予指定的函数或者类。友元的声明以关键字friend开始,只能出现在类定义的内部,友元的声明可以出现在类内部的任何地方。通常,将友元成组地放在类的开始或者结尾...

友元关系与继承——《C++ primer》笔记,书中的小bug

友元关系,friendship不能继承,书中想表达的意思是这种friendship不能继承是双向的。 也就是说,自己朋友的儿子不能访问自己,朋友也不能访问自己的儿子,唯一的关联是朋友和自己 但是,...

C++ primer 类 成员变量 成员函数 友元

看完C++Primer的第十二章,现简单总结一下: 类的思想:数据抽象与封装。 数据封装:指的是提供的接口与接口的实现是分离的,也就是说在使用接口时,只需要知道该接口的功能,而不必关心细节。 封装:显...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C++ Primer】第十五章 友元、异常和其他 --之二--->异常
举报原因:
原因补充:

(最多只允许输入30个字)