C++标准输入输出/C++异常机制/自定义模板
一、C++标准输入输出
1、四个类对象
cin:标准输入流(键盘)
cout:标准输出流(显示器)
ceer:标准错误流(不带缓冲区),直接输出到显示器
clog:标准错误流(带缓冲区),先把要输出的内容放到缓冲,直到缓冲区满或遇到换行endl才输出到 显示器
2、C++标准输入:在istream输入流类中定义对“>>”重载的一组公用成员函数,具体声明格式
istream& operator>>(T&);
C++标准输出:在ostream输出流类中定义对“<<”重载的。。。。。。。。。。。。。。。
ostream& operator <<(T&);
3、输入输出格式控制
(1)输入输出流枚举常量:在前面加ios::前缀就可以设置相应的格式
(2)输入输出流的内部函数
流成员函数 | 与之作用相同的控制符 | 作用 |
precision(n) | setprecision(n) | 设置实 数的精度为n位。 |
width(n) | setw(n) | 设置字段宽度为n位。 |
fill(c) | setfill(c) | 设置填充字符c。 |
setf( ) | setiosflags( ) | 设置输出格式状态,括号中应给出格式状态,内容与控制符setiosflags括号中内容相同。 |
ubsetf( ) | resetiosflags( ) | 终止已设置的输出格式状态。 |
(3)使用控制符控制输出格式
控制符 | 作用 |
dec | 设置整数的基数为10 |
hex | 设置整数的基数为16 |
oct | 设置 整数的基数为8 |
setbase(n) | 设置整数的基数为n(n只能是16,10,8之一) |
setfill(c) | 设置填充字符c,c可以是字符常量或字符变量 |
setprecision(n) | 设置实数的精度为n位。在以一般十进制小数形式输出时,n代表有效数字。在以fixed(固定小数位 数)形式和scientific(指数)形式输出时,n为小数位数。 |
setw(n) | 设置字段宽度为n位。 |
setiosflags(ios::fixed) | 设置浮点数以固定的小数位数显示。 |
setiosflags(ios::scientific) | 设置浮点数以科学计数法(即指数形式)显示。 |
setiosflags(ios::left) | 输出数据左对齐。 |
setiosflags(ios::right) | 输出数据右对齐。 |
setiosflags(ios::shipws) | 忽略前导的空格。 |
setiosflags(ios::uppercase) | 在以科学计数法输出E和十六进制输出字母X时,以大写表示。 |
setiosflags(ios::showpos) | 输出正数时,给出“+”号。 |
resetiosflags | 终止已设置的输出格式状态,在括号中应指定内容 |
二、C++异常机制
C++异常处理机制是由3个部分组成:检查(try)、抛出(throw)和捕捉(catch)
把需要检查的语句放在try中,throw用来当出现异常时发生一个异常信息,而catch则用来捕捉异常信息,如果捕捉到了异常信息就处理它。
1、首先介绍try
首先是把可能出现异常的、需要检查的语句或程序放在段放在try后面的花括号中。
try块可以嵌套、程序按顺序寻找匹配的异常处理器,抛出的异常将被第一个类型符合的异常处理器捕获 、如果内层try块后面没有找到合适的异常处理器,该异常向外传播,到外层try块后面的catch块中寻找 、没有被捕获的异常将调用terminate函数,terminate函数默认调用abort终止程序的执行,可以使用set_terminate函数指定terminate函数将调用的函数
try_catch语句形式如下 :
try
{
包含可能抛出异常的语句;
}
catch(类型名 [形参名]) // 捕获特定类型的异常
{
}
catch(类型名 [形参名]) // 捕获特定类型的异常
{
}
catch(...) // 三个点则表示捕获所有类型的异常
{
}
2、catch
(1)一个异常处理器一般只捕捉一种类型的异常
(2)异常处理器的参数类型和抛出异常的类型相同
(3)…表示可以捕获任何异常
注意事项:
在一个try_catch中,可以只有try块而无catch块。即只检查而不处理,把catch处理放在其他函数中。
但一个try_catch结构中只能有一个try块,但却可以有多个catch块,以便与不同的异常信息匹配。
3、throw
(1)可以抛出内置类型异常也可以抛出自定义类型异常
(2) throw抛出一个类对象会调用拷贝构造函数,因此常抛出临时对象,e.g. throw Myexception(“Myexception”);
(3)抛出异常后,异常发生之前创建的局部对象被销毁,这一过程称为栈展开。
什么是栈展开?
当一个函数里面抛出异常时,如果抛出的异常没有在该函数里面找到相应的catch处理模块,这个时候在抛出异常前的那些局部变量就开始销毁,最后整个函数调用的栈帧也被销毁。异常就到了调用该函数的去找catch处理模块,如果也没有 那么一样要销毁该调用函数的栈。就这样一层层的往外推。
注意:将派生类放在基类catch的上面,否则的话异常信息都会被基类接走(????)
三、自定义模板
1、函数模板定义与实例化
函数模板是C++新增的一种性质,它允许只定义一次函数的实现,即可使用不同类型的参数来调用该函数。这样可以减小代码的书写复杂度,同时也便于修改。
定义格式:
template<typename 形参名1,typename 形参名2,...>
返回类型 函数名
{函数体}
2、类模板定义与实例化
类模板为描述多个具有相同结构(成员变量及成员函数),仅成员类型不同(可能为int、char、double等类型)的类提供了方便。
模板类的定义格式如下:
template <class T1,class T2,......>
class <类名>
{
<成员说明>
};
其中,template是关键字,表示定义的是一个模板。类模板的定义是以template开始。T1,T2等为类模板的类型参数,用尖括号"<>"括起来,多个类型参数项之间用逗号隔开。在类成员的说明中,可以使用T1、T2等指定类中数据成员的类型、成员函数的参数类型和返回值类型。