- 1
- 0
- 约9.36千字
- 约 72页
- 2018-06-09 发布于福建
- 举报
Tarena—C语言程序的设计
格式化输入输出 showbase //输出前缀,八进制为0,十六进制为0x showpoint //打印尾零 showpos //正数加+号 uppercase //用E或ABCDEF而不是小写 unitbuf //一次输出操作后刷新 flags() //读标志 flags(fmtflags f) //添加标志 setf() //添加标志 unsetf() //清除标志 格式化输入输出 示例: const ios::fmtflags my_opt = ios::left|ios::oct|ios::fixed; fout.flags(fout.flags()|ios::showpos); fout.setf(ios::oct, ios::basefield);//第二个参数是个伪参数, 说明添加 格式化输入输出 函数调用 需要头文件iomanip cout.width(x);//设置最小宽度,只管一次 cout setw(x);//指定宽度 cout.precision();//取得精度 cout.precision(x);//指定精度,科学计数表示小数们,普通表示有效数据位 cout setprecision(x);//如果指定fixed,就为指定小数点位数。 cout.fill(char);//填充 no开头的代表取消某些标记 异常处理 异常 在程序遇到一个无法处理的问题时,一个函数可以: 终止程序 返回一个表示错误的值 返回一个值,并让程序处于非法状态 调用一个预先准备好在出现问题时用的函数 抛出异常 throw 的作用是导致堆栈的一系统回退。直到找到一个适当的catch. 函数声明异常:throw (异常类型),throw()代表不抛出任何异常,不声明代表可能抛出任何异常。 为什么不写不代表不抛出异常呢? 如果一个异常未捕获,就会导致调用 std::terminate()函数。 处理异常 异常的多态和捕获所有异常 处理异常的顺序 catch(...) 异常对象与临时对象有一些区别,它会一直保留直到处理,所以,catch一个异常对象是很正常的,并且我们经常使用引用。 异常的重新抛出 直接throw会重新抛出原先异常 由于异常导致的堆栈回退,申请的一些资源会自动调用析构造函数,所以程序出现异常时,对象的析构函数会释放资源。 构造和析构 构造函数中出现异常,如果已经申请到的堆内存可能不能释放。解决的办法是不要要构造函数中调用过多会出现异常的函数或使用auto_ptr. 构造函数中出现无法处理的问题时可以抛出异常以告知调用者。 析构函数的调用时机:1、正常调用 2、异常中堆栈回退,异常处理机制退出一个作用域,其中包含的析构函数会调用。如果析构函数中抛出异常,将会非常麻烦。 在函数虚函数覆盖时的异常描述 子类函数必须至少是父娄函数的异常描述一样受限(显式的或隐式的) class B{ public: virtual void f(); virtual void g() throw (X, Y); virtual void h() throw(X); }; class D: public B{ void f() throw (X);//ok void g() throw (X);//ok 比父类更受限 void h() throw (X, Y);//error }; 标准库异常 由语言抛出: bad_alloc(new抛出) bad_cast(dynamic_cast) bad_typeid(typeid) 标准库异常: exception异常:标准库的根异常 在头文件stdexcept中定义。 logic_error异常,exceptoin子异常 runtime_error exceptoin子异常 自定义异常 在系统设计的开始阶段,就要把异常处理策略加入系统,在系统实现后再包含有效的异常处理是非常困难的 异常处理提供一个单独的、统一的处理问题的技术,这有助于在一个大的项目中的程序员互相了解各自的错误处理代码 应避免利用异常处理作为控制流程序的替代模式 异常处理能够简化软件的各部分的组合,通过预定义的组件将问题传递给特定的程序组件,从而使它有效在工作在一起 当没有异常发生时,异常处理代码会造成很少甚至没有性能损失。因此,实现异常处理的程序运行起来比将错误处理代码和程序逻辑混合起来的程序更高效。 输入和输出 cout 对象 被编译器解释为: cout.operator(对象) 或 operator(cout, 对象) cin对象 被编译器解释为 cin.operator(对象) 或 operator(cin, 对象) 友元函数 将函数声明成
原创力文档

文档评论(0)