LInux C++学习day11 运行时类型信息 C++异常机制(Exception) I/O流

一 运行时类型信息
1 typeid操作符
#include
typeid(类型/对象);//返回typeinfo对象
1)typeinfo类包含name成员函数,可以返回字符串形式类型信息
2)typeinfo类提供了“==”和“!=”操作符重载支持,可以直接类型之间的比较
注:如果类型之间具有多态的继承关系,那么typeid还可以利用多态语法确定实际目标对象的类型。

2 dynamic_cast动态类型转换操作符
语法:
目标变量=dynamic_cast<目标类型>(源类型变量)
适用场景:
用于具有多态特性父子类指针或引用的显式类型转换.
注:dynamic在类型转换期间,会检查目标对象和期望转换的类型是否一致,如果一致则转换成功,不一致则失败;如果转换的是指针返回NULL表示失败,如果转换的是引用则抛出异常"bad_cast"表示失败.

二 C++异常机制(Exception)
1 程序开发中的常见错误
1)语法错误
2)逻辑错误
3)功能错误
4)设计缺陷
5)需求不符
6)环境异常
7)操作不当

2 传统C语言的错误处理方式
1)通过返回值表示错误
优点:保证函数调用路径中的所有栈对象得到正确析构,不会出现内存泄漏。
缺点:错误处理流程比较复杂,需要逐层判断返回值,代码臃肿。
2)通过远程跳转处理错误
优点:错误处理流程简单,不需要逐层返回值判断,实现了一步到位的错误处理。
缺点:函数调用路径中的栈对象失去被析构的机会,会形成内存泄漏。

3 C++异常机制
结合两种传统错误处理的优点,同时避免它们的缺点,在形式上实现一步到位错误处理,同时还能保证所有的栈对象得到正确析构.

4 C++异常语法
1)异常抛出
throw 异常对象;
2)异常检测和捕获
try{
可能发生异常的代码;
}
catch(异常类型1){
针对异常类型1的处理
}
catch(异常类型2){
针对异常类型2的处理
}

注:catch子句根据异常对象类型自上而下顺序匹配,而不是最优匹配;因此对子类类型的异常捕获一定写在前面,否则将会被基类类型的异常捕获语句所提前截获。

5 函数的异常说明
1)用于说明函数可以抛出的异常类型
返回类型 函数名(形参表)throw(异常类型表){函数体}
2)函数异常说明是一种承诺,表示该函数所抛出的异常类型不会超出说明的范围。而如果抛出异常说明以外的类型,则无法被正常捕获,而会被系统检测到,导致进程终止.
3)函数异常说明两种极端形式
–》不写异常说明,表示可以抛出任何类型异常
–》空异常说明, “throw()”,表示不会抛出任何类型异常
4)如果函数的声明和定义分开写,要保证异常说明一致,但是顺序无所谓。

//补充虚函数覆盖条件
5)如果基类中的虚函数带有异常说明,那么该函数在子类中的覆盖版本不能说明比基类版本抛出更多的异常,否则将会因为“放松throw限定”导致编译失败

6 标准异常类exception
class exception{
public:
exception() throw() { }
virtual ~exception() throw() ;

/*Returns a C-style character string describing 
  the general cause of the current error.  */
virtual const char* what() const throw();

};

try{
	...
}
catch(exception& ex){
	ex.what();
}

7 构造函数和析构函数中的异常
1)构造函数可以抛出异常,但对象将被不完整创建,这样的对象其析构函数不再会被自动执行;因此在构造函数抛出异常之前,需要手动销毁之前分配的动态资源.
2)析构函数最好不要抛出异常

三 I/O流
1 主要I/O流类
ios
/
istream ostream
/ | \ / |
istrstream ifstream iostream ofstream ostrstream

2 格式化I/O
1)格式化函数(成员函数)
cout << 100/3.0 << endl;//33.3333
cout.precision(10);
cout << 100/3.0 << endl;//33.33333333

2)流控制符(全局函数)
cout << 100/3.0 << endl;//33.3333
cout << setprecision(10) << 100/3.0
<< endl;//33.33333333

3 字符串流
#include //过时
istrstream/ostrstream

#include //推荐
istringstream //类似sscanf
ostringstream //类似sprintf

4 文件流
#include
ifstream //类似fscanf
ofstream //类似fprintf

5 二进制I/O
//类似fread()
istream& istream::read(char* buffer,streamsize num)

//类似fwrite()
ostream& ostream::write(const char* buf,size_t num)

猜你喜欢

转载自blog.csdn.net/weixin_43789711/article/details/90113611
今日推荐