day_11_异常、I/O流

来源:互联网 发布:农村淘宝服务站查询 编辑:程序博客网 时间:2024/06/10 17:17

    • 二十四异常Exception
      • 1程序开发中的常见错误
      • 2C中的错误处理机制
      • 3C异常处理机制
      • 4异常语法
      • 5函数异常说明
      • 6标准异常类
      • 7构造函数中的异常
      • 8析构函数最好不要抛出异常了解
    • 二十五IO流了解
      • 1主要IO流类
      • 2格式化IO
      • 3字符串流
      • 4文件流
      • 5二进制IO
      • 附录
        • 1IO流的状态成员函数
        • 2IO流格式化函数
        • 3IO流格式标志

二十四、异常(Exception)

1、程序开发中的常见错误

 1)语法错误
 2)逻辑错误
 3)功能错误
 4)设计缺陷
 5)需求不符
 6)环境异常
 7)操作不当

2、C中的错误处理机制

1)通过返回值表示错误
优点:
  函数调用路径中所有的局部对象都可以正常的被析构,不会出现内存泄漏;
缺点:
  错误处理流程比较复杂,逐层判断,代码臃肿;

2)通过远程跳转处理错误
优点:
  不需要逐层判断,一步到位的错误处理,代码精炼;
缺点:
  函数调用路径的局部对象失去被析构的机会,造成内存泄漏;

3、C++异常处理机制

结合C中两种错误处理的优点,同时避免它们的缺点,在实现一步到位的错误处理的同时,保证所有的栈对象可以正常被析构;

4、异常语法

1)异常抛出
  throw 基本类型变量;
  throw 类类型的对象;

2)异常捕获

try{    可能引发异常语句;    a;    b;//抛出异常    c;}catch(异常类型1){    针对异常类型1的处理;}catch(异常类型2){    针对异常类型2的处理;}...catch(...){    针对其它异常的处理;}

注意:
  catch子句根据异常对象的类型自上而下顺序匹配,而不是最优匹配,因此对子类类型的异常捕获不能放在对基类类型的异常捕获后面,否则前者将被后者提前截获。

5、函数异常说明

1)可以在函数原型中增加异常说明,说明该函数可能抛出的异常;
  返回类型 函数名(形参表)throw(异常类型表){...}

2)函数的异常说明是一种承诺,表示该函数不会抛出说明以外的异常类型。但是如果抛出了说明以外的异常,则无法捕获,而是被系统捕获,终止进程。

3)函数异常说明的两种极端形式:
  a. 不写异常说明,表示可以抛出任何异常;
  b. 空异常说明,throw(),表示不会抛出任何异常;

4)如果函数的声明和定义分开写,要保证其异常说明严格一致,但异常说明的顺序无所谓;

5)如果基类中的虚函数带有异常说明,那么该函数在子类的覆盖版本不能说明比基类版本抛出更多的异常,否则将因为放松throw的限定导致编译失败;

6、标准异常类

class exception{    public:        exception() throw(){}        virtual ~exception() throw(){}        virtual const char* what()const throw();};

7、构造函数中的异常

1)构造函数可以抛出异常,但是这样的对象将会被不完整构造,其析构函数永远不会被执行;
2)在构造函数抛出异常之前,需要手动地销毁所分配的动态资源。

8、析构函数最好不要抛出异常(了解)


二十五、I/O流(了解)

1、主要I/O流类

I/O流

2、格式化I/O

1)格式化函数(成员函数)

cout << 10/3.0 << endl; // 3.33333cout.precision(8); // 设置浮点数的精度:8位有效数字cout << 10/3.0 << endl; // 3.3333333

2)流控制符(全局函数)

cout << setprecision(10) << 10/3.0 << endl; // 3.333333333

3、字符串流

#include <sstream>istringstream // 读取内存,类似sscanfostringstream // 写入内存,类似sprintf(多变一)stringstream  // 读写内存

4、文件流

#include <fstream>ifstream // 读文件,类似fscanfofstream // 写文件,类似fprintffstream  // 读写文件

5、二进制I/O

// 类似fwrite()ostream& ostream::write(const char* buffer, size_t num);// 类似fread()istream& istream::read(char* buffer, streamsize num);

附录:

1、I/O流的状态成员函数

状态成员函数

2、I/O流格式化函数

格式化函数 功能 int ios::precision(int); 设置浮点精度,返回原精度; int ios::precision(void)const; 获取浮点精度; int ios::width(int); 设置显示域宽,返回原域宽; int ios::width(void)const; 获取显示域宽; char ios::fill(char); 设置填充字符,返回原字符; char ios::fill(void)const; 获取填充字符; long ios::flags(long); 设置格式标志,返回原标志; long ios::flags(void)const; 获取格式标志; long ios::setf(long); 添加格式标志位,返回原标志; long ios::setf(long, long); 添加格式标志位,返回原标志,先用第二个参数将互斥域清零; long ios::unsetf(long); 清除格式标志位,返回原标志;

3、I/O流格式标志

格式标志位 互斥域 说明 ios::left ios::adjustfield 左对齐 ios::right 右对齐 ios::internal 数值右对齐,符号左对齐 ios::dec ios::basefield 十进制 ios::oct 八进制 ios::hex 十六进制 ios::fixed ios::floatfield 用定点小数表示浮点数 ios::scientific 用科学计数法表示浮点数
格式标志位 说明 ios::showpos 正整数前面显示+号 ios::showbase 显示进制前缀0或0x ios::showpoint 显示小数点和尾数0 ios::uppercase 数中字母显示为大写 ios::boolalpha 用字符串表示布尔值 ios::unitbuf 每次插入都刷流缓冲 ios::skipws 以空白字符作分隔符

格式化控制符


格式化控制符


格式化控制符

原创粉丝点击