类型信息、异常、I/O流(day11)
二十三 运行时的类型信息
typeid运算符
#include <typeinfo>
typeid(类型/对象)
)返回typeinfo的对象,用于描述类型信息。
)在typeinfo类中包含了一个name()成员函数返回字符串形式类型信息。
)typeinfo类支持"=="、"!="的操作符重载,可以直接进行类型之间的比较,如果类型之间存在多态的继承关系,还可以利用多态的特性确定实际的对象类型。
eg:
cout << typeid(int).name() << endl;//i 动态类型转换dynamic_cast
语法:
目标类型变量 =
dynamic_cast<目标类型>(源类型变量);
场景:用于具有多态特性的父子类指针和引用之间进行显示的转换(向下造型)。
注:在转换过程中,会检查目标对象和期望转换的对象类型是否一致,如果一致转换成功,不一致转换失败。
如果转换的是指针,返回NULL表示失败,如果转换的是引用抛出异常"bad_cast"表示失败。 二十四 异常(Exception)
常见的错误
)语法错误
)逻辑错误
)功能错误
)设计缺陷
)需求不符
)环境异常
)操作不当 传统C中错误处理机制
)通过返回值表示错误
优点:函数调用路径中所有的栈对象,都能正确的被析构,不会内存泄露
缺点:错误处理流程比较复杂,逐层判断,代码臃肿 )通过远跳机制处理错误
优点:不需要逐层判断,一步到位错误处理,代码精炼
缺点:函数调用路径中的栈对象失去被析构的机会,有内存泄露的风险 C++异常机制
结合两种传统错误处理的优点,同时避免它们的缺点,在形式上实现一步到位的错误处理,同时保证所有栈对象能正确的被析构。 异常语法
)异常抛出
throw 异常对象;
eg:
throw -;
throw "File Error"; class FileError{};
throw FileError(...); )异常捕获
try{
可能发生异常的语句;
}
catch(异常类型1){
针对异常类型1的处理
}
catch(异常类型2){
针对异常类型2的处理
}
...
catch(...){
针对其它异常的处理
} 注:catch子句根据异常对象类型自上而下顺序匹配,因此对类类型的异常捕获要写到对基类类型的异常捕获的前面,否则子类的异常将被提前截获。 函数异常说明
)可以任何函数中增加异常说明,说明该函数所可能抛出的异常类型。
返回类型 函数名(形参表) throw(异常类型表){}
)函数的异常说明是一种承诺,表示该函数所抛出的异常不会超出说明的范围。如果函数抛出了异常说明以外的异常,则无法正常捕获,导致进程终止。
)异常说明极端形式
--》不写异常说明,表示可以抛出任何异常
--》空异常说明,throw(),表示不会抛出任何异常
)如果函数声明和定义分开,要保证异常说明的类型一致。 补充:函数重写要求
如果基类中的虚函数带有异常说明,那么该函数在子类中覆盖版本不能说明比基类抛出更多的异常,否则将因为"放松throw限定"而编译报错. 标准异常类
class exception{
public:
exception()throw(){}
virtual ~exception()throw(){}
virtual const char* what() const throw();
};
eg:
class A:public exception{
public:
const char* what() const throw(){
//...
return "Error A";
}
};
try{
throw A();
}
catch(exception& ex){
ex.what();//Error A
} 构造函数和析构函数中的异常
)构造函数抛出异常,该对象将会被不完整构造,这样对象的析构函数永远不会被自动执行。因此在构造函数抛出异常之前,需要手动销毁之前分配的动态资源。
)析构函数最好不要抛出异常 ---------------------------------
二十五 I/O流 //了解
主要的I/O流类
ios
/ \
istream ostream
/ | \ / | \
istrstream ifstream iostream ofstream ostrstream
/ \
strstream fstream
格式化I/O
)格式化函数
eg:
cout << /3.0 << endl;//3.33333
cout.precision();
cout << /3.0 << endl;//3.333333333
)流控制符
eg:
cout << /3.0 << endl;//3.33333
cout << setprecision() <<
/3.0 << endl;//3.333333333 字符串流
#include <strtstream>//过时
istrstream ostrstream strstream #include <sstream>//当前用的比较多
istringstream//读取内存,sscanf()
ostringstream//写入内存,sprintf()
stringstream //读写内存 文件流
#include <fstream>
ifstream //读取文件,fscanf
ofstream //写入文件,fprintf
fstream //读写文件 二进制I/O //fread、fwrite
ostream& ostream::write(
const char* buffer,size_t num); istream& istream::read(
char* buffer,streamsize num);
类型信息、异常、I/O流(day11)的更多相关文章
- 【转】【C#】异常类 Exception 枚举所有类型的异常
一.基础 在C# 里,异常处理就是C# 为处理错误情况提供的一种机制.它为每种错误情况提供了定制的处理方式,并且把标识错误的代码与处理错误的代码分离开来. 对.NET类来说,一般的 异常类System ...
- ndk学习之c++语言基础复习----C++容器、类型转换、异常与文件流操作
继续来复习C++,比较枯燥,但是这是扎实掌握NDK开发的必经之路,不容小觑. 容器: 容器,就是用来存放东西的盒子. 常用的数据结构包括:数组array, 链表list, 树tree, 栈stack, ...
- “RazorEngine.Templating.TemplateCompilationException”类型的异常在 RazorEngine.NET4.0.dll 中发生,但未在用户代码中进行处理
错误信息: "RazorEngine.Templating.TemplateCompilationException"类型的异常在 RazorEngine.NET4.0.dll 中 ...
- JAVA类型信息——Class对象
JAVA类型信息——Class对象 一.RTTI概要 1.类型信息RTTI :即对象和类的信息,例如类的名字.继承的基类.实现的接口等. 2.类型信息的作用:程序员可以在程序运行时发现和使用类型信息. ...
- ServerVersion 引发了“System.InvalidOperationException”类型的异常
遇到这样一个问题:添加互评信息,断点调试,跳转到BLL层后就直接跳到SqlHelper中弹出错误,说:未将对象设置引用到实例等.还请人帮忙调试代码,调试半天发现抽象工厂并没成功完成反射,奇怪的是:将出 ...
- 读书笔记 effective c++ Item 47 使用traits class表示类型信息
STL主要由为容器,迭代器和算法创建的模板组成,但是也有一些功能模板.其中之一叫做advance.Advance将一个指定的迭代器移动指定的距离: template<typename IterT ...
- oracle有三种类型的异常错误: 预定义 ( Predefined )错误里面的常见错误
oracle有三种类型的异常错误: 预定义 ( Predefined )错误, 非预定义 ( Predefined )错误, 用户定义(User_define) 错误 预定义 ( Predefined ...
- Java基础 -- 深入理解Java类型信息(Class对象)与反射机制
一 RTTI概念 认识Claa对象之前,先来了解一个概念,RTTI(Run-Time Type Identification)运行时类型识别,对于这个词一直是 C++ 中的概念,至于Java中出现RT ...
- mvc 使用预置队列类型存储异常对象
using PaiXie.Utils; using System; using System.Collections.Generic; using System.Linq; using System. ...
随机推荐
- org.hibernate.PropertyValueException: not-null property references a null or transient value: model.
今天在写一个SSH整合的项目时,首先将数据库操作部分单独分离出来,写完后使用Junit进行測试,经过測试.发现没有不论什么问题,对数据库中的内容进行增删改查没有问题,可是将他整合到SSH的项目中时,报 ...
- 关于Windows下程序运行的说明
预计有非常多人首次都是通过Windows(微软的操作系统)来使用计算机的.Windows的设计导致非常多人觉得全部程序仅仅要双击一下就能够被正确运行了,所以一大堆初学程序设计的童鞋就会遇到些疑问: 为 ...
- java 将byte[]转为各种进制的字符串
public void test() { byte[] bytes = new byte[10000000]; for (int i = 0; i < 10000000; i++) { if ( ...
- Spring+Mybatis之登录功能demo
其实工作之后就没有用过Spring+Mybatis的框架了,因为公司有一个自己开发的框架,讲道理,其实这个与Spring+Mybatis整合很是神似.当然性能上还是比不上Spring+Mybatis所 ...
- C# winform 组件---- folderBrowserDialog与openFileDialog(转)
C# winform 组件---- folderBrowserDialog与openFileDialog 2009-06-27 13:36 2153人阅读 评论(1) 收藏 举报 winformc#b ...
- B3038 上帝造题的七分钟2 线段树
这就是一道变得比较奇怪的线段树,维护每个区间的最大值和区间和,然后关键在于每次取根号的话数值下降的特别快,不用几次就都是1了,所以每次暴力单点修改,然后直接找区间最大值,假如区间最大值是1的话,就直接 ...
- bzoj2120 数颜色——带修莫队
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2120 带修改的莫队: 用结构体存下修改和询问,排好序保证时间后就全局移动修改即可: 参考了T ...
- 大数据攻城狮之Hadoop伪分布式篇
对于初学大数据的萌新来说,初次接触Hadoop伪分布式搭建的同学可能是一脸萌笔的,那么这一次小编就手把手的教大家在centos7下搭建Hadoop伪分布式. 底层环境: VMware Workstat ...
- Git 和 Redis 的基本认识
一: Git 二: Redis
- python 10:len(list)(获取列表长度)以及负访问性
bicycles = ['trek', 'cannondale', 'redline', 'specialized'] print(len(bicycles)) #获取某列表长度,即列表元素个数 pr ...