C++小记(八)

关键词:类型转换,异常抛出,输入输出流

强制类型转换

   在C语言中,任意类型之间都能进行强制类型转换,所以导致了C语言中强转过于粗暴,难于定位的 特点,在程序设计理论中强制类型转换是不被推荐的,应尽量避免使用。

C++中同样有强制类型转换,只不过相较于C语言,C++将强制类型转换封装成了几种关键字:

  • static_cast<T>(expr)
  • reinterpret_cast<T>(expr) 
  • dynamic_cast<T>(expr)
  • const_cast<T>(expr)

static_cast<T>(expr)

            

 static_cast有个重点注意:无法用于普通指针变量之间的类型转换

reinterpret_cast<T>(expr) 

dynamic_cast<T>(expr)

  • dynamic_cast主要用于类层次间的转换,还可用于类之间的交叉转换
  • 具有类型检查功能,比static_cast更安全,用法同static_cast

const_cast<T>(expr)

const_cast主要用于去除const属性

/*********************************************************************************************************/

 

异常处理机制

     异常是一种程序控制机制,与函数机制独立和互补,函数是一种以栈结构展开的上下函数衔接的程序控制系统,异常是另一种控制结构,它依附于栈结构,却可以同时设置多个异常类型作为网捕条件,从而以类型匹配在栈机制中跳跃回馈。

异常的基本语法:

  1.      若有异常则通过throw操作创建一个异常对象并抛掷。
  2.  将可能抛出异常的程序段嵌在try块之中。控制通过正常的顺序执行到达try语句,然后执行try块内的保护段。
  3.  如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句就不执行。程序从try块后跟随的最后一个catch子句后面的语句继续执行下去。
  4. catch子句按其在try块后出现的顺序被检查。匹配的catch子句将捕获并处理异常(或继续抛掷异常)。
  5.  如果匹配的处理器未找到,则运行函数terminate将被自动调用,其缺省功能是调用abort终止程序。
  6. 处理不了的异常,可以在catch的最后一个分支,使用throw语法,向上扔。
  7. 异常机制与函数机制互不干涉,但捕捉的方式是基于类型匹配。捕捉相当于函数返回类型的匹配,而不是函数参数的匹配,所以捕捉不用考虑一个抛掷中的多种数据类型匹配问题
  8.  异常捕捉严格按照类型匹配 
  9. 异常捕捉的类型匹配之苛刻程度可以和模板的类型匹配媲美,它不允许相容类型的隐式转换,比如,抛掷char类型用int型就捕捉不到
//double division(int x, int y);      //函数声明,可以抛出任何异常
//double division(int x, int y) throw(); //不可以跑出任何异常
double division(int x, int y)throw(int, char);//可以抛出int,char类型的异常

double division(int x, int y)
{
	if (y == 0)
	{
		throw 0;         //throw对异常情况进行抛出,抛出类型自定义
		//throw 'e';
	}

	return x / y;
}


int main()
{
	int a, b;
	cin >> a >> b;
	try                          //try对可能出现异常的语句进行性尝试
	{
		cout << division(a, b) << endl;
	}
	catch (int)                  //catch根据抛出异常的类型进行匹配,执行相应的异常处理
	{
		cout << "int 0 exception" << endl;
	}
	catch (char)
	{
		cout << "char 0 exception" << endl;
	}
}

栈解旋:

      异常被抛出后,从进入try块起,到异常被抛掷前,这期间在栈上的构造的所有对象,都会被自动析构。析构的顺序与构造的顺序相反。这一过程称为栈的解旋(unwinding)。

/*********************************************************************************************************/
 

输入输出流

C++输入输出包含以下三个方面的内容:

  1.     对系统指定的标准设备的输入和输出。即从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准I/O。
  2.     以外存磁盘文件为对象进行输入和输出,即从磁盘文件输入数据,数据输出到磁盘文件。以外存文件为对象的输入输出称为文件的输入输出,简称文件I/O。
  3.     对内存中指定的空间进行输入和输出。通常指定一个字符数组作为存储空间(实际上可以利用该空间存储任何信息)。这种输入和输出称为字符串输入输出,简称串I/O。
     
  • 在C++的输入输出中,编译系统对数据类型进行严格的检查,凡是类型不正确的数据都不可能通过编译。因此C++的I/O操作是类型安全(type safe)的。C++的I/O操作是可扩展的,不仅可以用来输入输出标准类型的数据,也可以用于用户自定义类型的数据。
  •       C++通过I/O类库来实现丰富的I/O功能。这样使C++的输人输出明显地优于C 语言中的printf和scanf,但是也为之付出了代价,C++的I/O系统变得比较复杂,要掌握许多细节。
  •       C++编译系统提供了用于输入输出的iostream类库。iostream这个单词是由3个部 分组成的,即i-o-stream,意为输入输出流。

猜你喜欢

转载自blog.csdn.net/userkiller/article/details/81411088