二十三 运行时的类型信息
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)的更多相关文章

  1. 【转】【C#】异常类 Exception 枚举所有类型的异常

    一.基础 在C# 里,异常处理就是C# 为处理错误情况提供的一种机制.它为每种错误情况提供了定制的处理方式,并且把标识错误的代码与处理错误的代码分离开来. 对.NET类来说,一般的 异常类System ...

  2. ndk学习之c++语言基础复习----C++容器、类型转换、异常与文件流操作

    继续来复习C++,比较枯燥,但是这是扎实掌握NDK开发的必经之路,不容小觑. 容器: 容器,就是用来存放东西的盒子. 常用的数据结构包括:数组array, 链表list, 树tree, 栈stack, ...

  3. “RazorEngine.Templating.TemplateCompilationException”类型的异常在 RazorEngine.NET4.0.dll 中发生,但未在用户代码中进行处理

    错误信息: "RazorEngine.Templating.TemplateCompilationException"类型的异常在 RazorEngine.NET4.0.dll 中 ...

  4. JAVA类型信息——Class对象

    JAVA类型信息——Class对象 一.RTTI概要 1.类型信息RTTI :即对象和类的信息,例如类的名字.继承的基类.实现的接口等. 2.类型信息的作用:程序员可以在程序运行时发现和使用类型信息. ...

  5. ServerVersion 引发了“System.InvalidOperationException”类型的异常

    遇到这样一个问题:添加互评信息,断点调试,跳转到BLL层后就直接跳到SqlHelper中弹出错误,说:未将对象设置引用到实例等.还请人帮忙调试代码,调试半天发现抽象工厂并没成功完成反射,奇怪的是:将出 ...

  6. 读书笔记 effective c++ Item 47 使用traits class表示类型信息

    STL主要由为容器,迭代器和算法创建的模板组成,但是也有一些功能模板.其中之一叫做advance.Advance将一个指定的迭代器移动指定的距离: template<typename IterT ...

  7. oracle有三种类型的异常错误: 预定义 ( Predefined )错误里面的常见错误

    oracle有三种类型的异常错误: 预定义 ( Predefined )错误, 非预定义 ( Predefined )错误, 用户定义(User_define) 错误 预定义 ( Predefined ...

  8. Java基础 -- 深入理解Java类型信息(Class对象)与反射机制

    一 RTTI概念 认识Claa对象之前,先来了解一个概念,RTTI(Run-Time Type Identification)运行时类型识别,对于这个词一直是 C++ 中的概念,至于Java中出现RT ...

  9. mvc 使用预置队列类型存储异常对象

    using PaiXie.Utils; using System; using System.Collections.Generic; using System.Linq; using System. ...

随机推荐

  1. shell EOF注意点

    当sqlplus与shell交互的时候我们这么用 su - oracle -c "sqlplus / as sysdba<<EOF select * from gv($insta ...

  2. 【oracle 11G Grid 】Crsctl start cluster 和 crsctl start crs 有差别么?

     [oracle 11G Grid ]Crsctl start cluster 和 crsctl start crs 有差别么? q:Crsctl start cluster 是 11.2新特性和 ...

  3. Linux IPC之共享内存C 事例

    Linux IPC之共享内存 标签: linuxrandomnull工作 2011-08-25 11:52 4123人阅读 评论(0) 收藏 举报  分类: Linux(3)  读书札记(3)  版权 ...

  4. 开发DataSnapserver

     在上次的文章中讨论了怎样把传统的Delphi 主从架构应用程序逐渐转换为DataSnap JSONserver.在本篇文章中让我们正式讨论怎样使用Delphi XE开发DataSnap/REST ...

  5. Codeforces Round #332 (Div. 2) B. Spongebob and Joke 模拟

    B. Spongebob and Joke     While Patrick was gone shopping, Spongebob decided to play a little trick ...

  6. luogu2341 [HAOI2006]受欢迎的牛

    题目大意 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的——如果A喜欢B,B喜欢C,那么A也喜欢C.牛 ...

  7. 洛谷P3834 可持久化线段树(主席树)模板

    题目:https://www.luogu.org/problemnew/show/P3834 无法忍受了,我要写主席树! 解决区间第 k 大查询问题,可以用主席树,像前缀和一样建立 n 棵前缀区间的权 ...

  8. Java -JVM:JVM百科

    ylbtech-Java -JVM:JVM百科 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机 ...

  9. Reactive Native开发环境搭建

    root@zhongzhenhua-virtual-machine:~/AndroidCode# repo init -u https://android.googlesource.com/platf ...

  10. Linux学习笔记--文件夹结构

    暂时先上一张图学习吧,先大致了解好,再进行深入的学习.