C++标准输入输出/C++异常机制/自定义模板

一、C++标准输入输出

1、四个类对象

cin:标准输入流(键盘)

cout:标准输出流(显示器)

ceer:标准错误流(不带缓冲区),直接输出到显示器

clog:标准错误流(带缓冲区),先把要输出的内容放到缓冲,直到缓冲区满或遇到换行endl才输出到 显示器

2、C++标准输入:在istream输入流类中定义对“>>”重载的一组公用成员函数,具体声明格式

    istream& operator>>(T&);

    C++标准输出:在ostream输出流类中定义对“<<”重载的。。。。。。。。。。。。。。。

    ostream& operator <<(T&);

3、输入输出格式控制

扫描二维码关注公众号,回复: 2421027 查看本文章

(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++新增的一种性质,它允许只定义一次函数的实现,即可使用不同类型的参数来调用该函数。这样可以减小代码的书写复杂度,同时也便于修改。

mark:使用函数模板并不会减少最终可执行程序的大小,因为在调用模板函数时,编译器都根据调用时的参数类型进行形影的实例化。

定义格式:

template<typename 形参名1,typename 形参名2,...>

返回类型  函数名

{函数体}

2、类模板定义与实例化

类模板为描述多个具有相同结构(成员变量及成员函数),仅成员类型不同(可能为int、char、double等类型)的类提供了方便。

模板类的定义格式如下:

template <class T1,class T2,......>

class <类名>

{

<成员说明>

};

其中,template是关键字,表示定义的是一个模板。类模板的定义是以template开始。T1,T2等为类模板的类型参数,用尖括号"<>"括起来,多个类型参数项之间用逗号隔开。在类成员的说明中,可以使用T1、T2等指定类中数据成员的类型、成员函数的参数类型和返回值类型。

猜你喜欢

转载自blog.csdn.net/linuxwln/article/details/79958956