这是本门《面向对象程序设计》课最后一次上课,刚好上完了这本《Thinking in C++》 :)

这节课首先讲了流 Stream 的概念

平时我们主要用的是(1)在屏幕上输入输出的 cin cout 流

         (2)在文件中输入输出的 ifstream ofstream 流

         (3)在字符串中输入输出的 istringstream ostringstream istrstream ostrstream 流

具体实例可以看以下代码:

/*************************************************************************
> File Name: Code09.cpp
> Author: Jeremy Wu
> Created Time: Mon 08 Jun 2015 09:55:51 AM CST
************************************************************************/ //跟字符串相关的流:1)支持C风格的字符串流
// 2)支持C++风格的字符串流
// 1 ) strstream (istrstrstream, ostrstream)
// 2 ) stringstream (istringstream, ostringstream) #include <iostream>
#include <sstream>
#include <string> using namespace std; float str_to_float (const char * s) {
istrstream tmp (s, strlen (s));
float ans;
tmp >> ans;
return ans;
} int main () { //想把整数输入到字符串里 ostringstream oss;
int i = ;
double d = 1.414; oss << i << '\t' <<d;
string str = oss.str (); cout << str << endl; //C++ 字符串 istringstream iss ("223 2.414");
iss >> i >> d;
cout << i << '\t'<< d << endl; //C 字符串 char *s = "v -3.1 // 3.1415"; return ;
}

在C语言中对输出的控制是非常方便的,同样,在C++中也可以对输出作格式控制,并且功能更加强大

在控制格式上有两种方法: (1)使用 setfs 等控制符

             (2)cout 的时候使用操作值

/*************************************************************************
> File Name: Code07.cpp
> Author: Jeremy Wu
> Created Time: Mon 08 Jun 2015 09:46:45 AM CST
************************************************************************/ //流的输入输出的格式化
// 控制格式两种方式 1)使用 setfs 等控制符
// 2)cout 的时候使用操作值 #include <iostream> using namespace std; //ios 是所有流的基类 ios::fmtflags oldFlag = cout.flags (); int main () { int i = ;
cout.setf (ios::showpos); //显示正负号
cout << i << endl;
cout.setf (ios::showbase); //显示进制号
//16进制输出
cout << hex << i << endl;
//8进制输出
cout << oct << i << endl << endl; cout.flags (oldFlag); //默认保留6位数字
double f = 1234.56789;
cout << "default: \t" << f << endl; //科学计数法,默认保留小数后6位数字
cout.setf (ios::scientific, ios::floatfield);
cout << "scientific: \t" << f << endl; //固定点模式,默认保留小数后6位数字
cout.setf (ios::fixed, ios::floatfield);
cout << "fixed: \t " << f << endl; //恢复默认值
cout.setf (ios::fmtflags (), ios::floatfield);
cout << "default: \t" << f << endl << endl; //输出浮点数默认精度
cout << "default precision is " << cout.precision () << endl; //修改默认精度
cout.precision (); cout << "after precision (8)" << endl;
cout << "default: \t" << f << endl; cout.setf (ios::scientific, ios::floatfield);
cout << "scientific: \t" << f << endl; cout.setf (ios::fixed, ios::floatfield);
cout << "fixed: \t" << f << endl << endl; cout.flags (oldFlag); //输出预留宽度
cout << "Current width: \t" << cout.width ()
<< "\t Currend fill character : \t" << cout.fill () << endl; cout.precision (); //设置预留宽度
//设置填充为 #
//默认按右边对齐
//
// ·修改 width 只针对下一次输出有效
//
cout.width ();
cout.fill ('#'); cout << f << endl; cout << "Current width: \t" << cout.width ()
<< "\t Currend fill character : \t" << cout.fill () << endl; cout << f << endl << endl; cout.width ();
cout << -f << endl;
cout.width (); //左边对齐
cout.setf (ios::left, ios::adjustfield);
cout << -f << endl;
cout.width (); //中间对齐
cout.setf (ios::internal, ios::adjustfield);
cout << -f << endl << endl; cout.flags (oldFlag); return ;
}

在C++ 中有个非常有用的功能叫做模板 Template

以下是一个 Template 简短 的例子

在自己写模板的时候得注意许多小细节,比较在类的外部定义函数的时候需要在前面加上模板头还要在类后面加上<T>等

/*************************************************************************
> File Name: Code08.cpp
> Author: Jeremy Wu
> Created Time: Mon 08 Jun 2015 09:51:33 AM CST
************************************************************************/ //函数模板
//实例化的真正含义: 函数模板 -> 模板函数 #include <iostream>
#include <cstring> using namespace std; /*
int sum (int a, int b) {
return a + b;
} double sum (double a, double b) {
return a + b;
}
*/ //模板的定义
template <typename T> //template head
T sum (T _a, T _b) {
return _a + _b;
} //模板变量和模板常量(可以提供默认值
template <typename T = double, int Size = >
class Array {
private:
//const static int Size = 100;
T a[Size];
public:
Array () { memset (a, , sizeof (a)); }
T & operator [] (int index);
Array & operator + (T rhs) {
for (int i = ; i < Size; ++i) a[i] += rhs;
return *this;
}
}; //在类的外部定义的时候
// 1)加模板头
// 2)类后面加 <T>
template <typename T, int Size>
T & Array <T, Size>::operator [] (int index) {
if (index < || index >= Size) {
cout << "out of range" << endl;
//exit (0);
} else {
return a[index];
} } int main () { //模板的实例化 : 显示实例化 和 隐示实例化
/*
int i (10), j (7);
cout << sum (i, j) << endl; double d1 (12.3), d2 (7.9);
cout << sum <int> (d1, d2) << endl;
*/ //Array <double, 100> ay;
Array <>ay;
ay[] = ;
cout << ay[] << endl; ay = ay + 5.2;
cout << ay[] << endl; return ;
}

接下来是异常处理

需要正确理解在异常处理整个周期中流程

catch (...) // ... 可以捕捉任何类型的异常,并且这句 catch 必须放在所有 catch 的最后

/*************************************************************************
> File Name: Code10.cpp
> Author: Jeremy Wu
> Created Time: Mon 08 Jun 2015 11:44:31 AM CST
************************************************************************/ //异常处理: exception handling
//try \ throw \ catch
//要理解异常处理的执行顺序 #include <iostream>
#include <string> using namespace std; class ExcepClass {
public:
string message () { return "devide number is invalid"; }
}; double devide (int a, int b) {
if ( == b) throw ExcepClass (); //如果符合条件,函数结束,所有局部变量释放
cout << "Just after throw" << endl;
return double (a) / b;
} int main () { cout << "Before exception" << endl; try {
int i (), j ();
cout << devide (i, j) << endl; //出现异常以后的所有代码都不会被执行
cout << "After devide (i, j)" << endl;
} catch (ExcepClass k) { //类型必须匹配捕捉到的类型
cout << k.message () << endl;
} catch (int m) { }
catch (...) { //捕捉任何类型的异常,并且...必须放在最后
cout << "Captur all exception" << endl;
} //结束异常处理
cout << "After capture processing" << endl; return ;
}

至此,一系列上课笔记

END

面向对象程序设计-C++ Stream & Template & Exception【第十五次上课笔记】的更多相关文章

  1. 201271050130-滕江南-《面向对象程序设计(java)》第十五周学习总结

    201271050130-滕江南-<面向对象程序设计(java)>第十五周学习总结 博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.c ...

  2. 201871010111-刘佳华《面向对象程序设计(java)》第十五周学习总结

    201871010111-刘佳华<面向对象程序设计(java)>第十五周学习总结 实验十三  Swing图形界面组件(二) 实验时间 2019-12-6 第一部分:理论知识总结 5> ...

  3. 201871010123-吴丽丽《面向对象程序设计(Java)》第十五周学习总结

    201871010123-吴丽丽<面向对象程序设计(Java)>第十五周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  4. 201871010104-陈园园 《面向对象程序设计(java)》第十五周学习总结

    201871010104-陈园园 <面向对象程序设计(java)>第十五周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  5. 201871010105-曹玉中《面向对象程序设计(java)》第十五周学习总结

    201871010105-曹玉中<面向对象程序设计(java)>第十五周学习总结 项目 内容 这个作业属于哪个过程 https://www.cnblogs.com/nwnu-daizh/ ...

  6. 201871010107-公海瑜《面向对象程序设计(java)》第十五周学习总结

    201871010107-公海瑜<面向对象程序设计(java)>第十五周学习总结             项目                            内容   这个作业属于 ...

  7. 201871010128-杨丽霞《面向对象程序设计(java)》第十五周学习总结

    201871010128-杨丽霞<面向对象程序设计(java)>第十五周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  8. 201871010133-赵永军《面向对象程序设计(java)》第十五周学习总结

    201871010133-赵永军<面向对象程序设计(java)>第十五周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  9. 201871020225-牟星源《面向对象程序设计(java)》第十五周学习总结

    201871020225-牟星源<面向对象程序设计(java)>第十五周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

随机推荐

  1. 有关Gcd,Lcm的一点小结论

    先介绍两个: 大数的Gcd Stein+欧几里德 function stein(a,b:int64):int64; begin if a<b then exit(stein(b,a)); the ...

  2. UVA-514 Rails (栈)

      Rails  There is a famous railway station in PopPush City. Country there is incredibly hilly. The s ...

  3. CSS换行2

    1.可以使用强制换行符号<br />换行.如果在一个文章里可以在文章需要换行的地方加入<br />即可实现自动换行-常说的小换行,与换行前没有间隔.实例如下图 换行说明图无间隔 ...

  4. struts2页面输出错误信息

    <package name="user" namespace="/user" extends="struts-default"> ...

  5. jar 包和批量处理

    打jar包: 选择要打包的文件: javac -d . Hello.java .代表打包的目标路径 jar cvf test.jar com  //test是打包名称,com是打包的文件夹 修改tes ...

  6. Linux Mysql Client 查询中文乱码

    1.mysql client 端设置编码为utf8 set character_set_results=utf8; 2.连接linux的客户端的编码也要设置为utf8(比如xshell,putty等)

  7. pl/sql oracle

    http://uule.iteye.com/blog/2061773(出处) 批量导入脚本: 打开一个command window  > 输入@ > 它会让你选择要导入的文件 (自己要知道 ...

  8. 国内BI工具/报表工具厂商简介

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  9. 英文论文中“such as, for example, e.g., i.e., etc., et al. ”的用法分析 (转)

    在英文论文的编辑加工中,常会遇到such as, for example, e. g. , i. e. , etc. 和et al. 的错误及混淆使用.这里,举例分析这几个词的意义,并阐述其正确用法. ...

  10. Qt多线程编程总结(二)——QMutex

    QMutex类提供的是线程之间的访问顺序化. QMutex的目的是保护一个对象.数据结构或者代码段,所以同一时间只有一个线程可以访问它.(在Java术语中,它和同步关键字“synchronized”很 ...