首页 > 代码库 > 2017/03/24学习笔记
2017/03/24学习笔记
类型转换
C语言中的强制类型转换很简单,不管什么类型的转换都是
TYPE b=(TYPE)a;
C++中类型转换提供了4种类型转换操作符来应对不同场合的应用。
static_cast 静态转换。如int转换成char
reinterpreter_cast 重新解释类型
dynamic_cast 命名上理解是动态类型转换。如子类和父类之间的多态类型转换 (父类转子类,向下转型)
const_cast 字面理解就是去const属性.
4种类型转换格式
TYPE b=static_cast<TYPE>(a);
类型转换一般性介绍
static_cast<>()静态类型转换,编译时C++编译器会做类型检查。
基本类型能转换,但是不能转换指针类型。
若不同类型之间,进行强制类型转换,用reinterpret_cast<>()进行重新解释.
一般性结论:
C语言中能隐式类型转换,在C++中可用static_cast<>()转换。因C++编译器在编译检查一般都能通过。
C语言中不能隐式转换的,在C++中可用reinterpret_cast()强制类型解释。
static_cast<>()和reinterpret_cast<>()基本上把C语言中的强制类型转换给覆盖。
reinterpret_cast<>()很难保证移植性.
dynamic_cast<>()动态类型转换,安全的父类和子类之间转换;运行时类型检查
const_cast<>()去除变量的只读属性.
异常处理机制
异常是一种程序控制机制,与函数机制独立互补。
函数是一种以栈结构展开的上下函数衔接的程序控制系统,异常是另一种控制结构,他依附于栈结构,却可以同时设置多个异常类型作为网捕条件,从而以类型匹配在栈机制中跳跃回馈。
异常设计目的
栈机制是一种高度节律控制机制,面向对象却要求对象之间有方向 有目的的控制传动,从一开始,异常就是冲着改变程序控制结构,以适应面向对象程序更有效地工作这个主题,而不是仅为了继续错误处理。
异常设计出来后,却发现错误处理方面获得了最大的好处.
异常如果没有catch将激发terminate函数。
该函数调用引起运行终止的abort函数.
最后一道防线的函数可以有程序员设置,从而规定其终止前的行为。
修改默认行为:
可以通过set_terminate函数修改未catch异常的默认处理器,从而使得发生未catch异常,被自定义函数处理
void myTerminate(){cout<<"Here is my terminate\n"};
set_terminate(myTerminate);
set_terminate函数在头文件exception中声明,参数为函数指针void(*)();
构造函数没有返回类型,无法通过返回值来报告运行状态,所以只通过一种非函数机制的途径,即异常机制,来解决构造函数的出错问题
异常机制和函数机制互补干涉,但捕捉的方式是基于类型匹配。捕捉相当于函数返回类型的匹配,而不是函数参数的匹配,所以捕捉不要考虑多钟数据类型匹配问题。
栈解旋(unwinding)
异常被抛出后,从进入try块起,到异常被抛出前,这期间在栈上的所以对象,都会被自动析构,析构的顺序和构造的顺序相反。
异常接口声明
为了加强程序的可读性,可以在函数声明中列出可能抛出的所以异常类型,如:
void fun()throw(A,B,C,D);//这个函数能且只能抛出ABCD及其子类的异常.
如果在函数声明中没有包含异常接口声明,则此函数可以抛出任何类型的异常。
如果一个函数不抛出任何类型的异常可以声明为:
void fun()throw();
如果一个函数抛出了他的异常接口声明所不允许抛出的异常,unexpected函数会被调用,该函数默认行为调用terminate函数终止程序.
异常变量的生命周期
1.如果catch异常的时候,使用一个异常变量,则会copy构造异常变量(会创建两个异常变量)
2.使用引用,只创建一个异常变量
3.指针可以和引用/元素一起catch但是引用和元素不能一起写.(如果是指针,跑异常的时候需要 new一个异常对象,需要手动delete异常对象)
推荐使用引用
2017/03/24学习笔记