面向对象程序设计-C++ Stream & Template & Exception【第十五次上课笔记】
这是本门《面向对象程序设计》课最后一次上课,刚好上完了这本《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【第十五次上课笔记】的更多相关文章
- 201271050130-滕江南-《面向对象程序设计(java)》第十五周学习总结
201271050130-滕江南-<面向对象程序设计(java)>第十五周学习总结 博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.c ...
- 201871010111-刘佳华《面向对象程序设计(java)》第十五周学习总结
201871010111-刘佳华<面向对象程序设计(java)>第十五周学习总结 实验十三 Swing图形界面组件(二) 实验时间 2019-12-6 第一部分:理论知识总结 5> ...
- 201871010123-吴丽丽《面向对象程序设计(Java)》第十五周学习总结
201871010123-吴丽丽<面向对象程序设计(Java)>第十五周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- 201871010104-陈园园 《面向对象程序设计(java)》第十五周学习总结
201871010104-陈园园 <面向对象程序设计(java)>第十五周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- 201871010105-曹玉中《面向对象程序设计(java)》第十五周学习总结
201871010105-曹玉中<面向对象程序设计(java)>第十五周学习总结 项目 内容 这个作业属于哪个过程 https://www.cnblogs.com/nwnu-daizh/ ...
- 201871010107-公海瑜《面向对象程序设计(java)》第十五周学习总结
201871010107-公海瑜<面向对象程序设计(java)>第十五周学习总结 项目 内容 这个作业属于 ...
- 201871010128-杨丽霞《面向对象程序设计(java)》第十五周学习总结
201871010128-杨丽霞<面向对象程序设计(java)>第十五周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- 201871010133-赵永军《面向对象程序设计(java)》第十五周学习总结
201871010133-赵永军<面向对象程序设计(java)>第十五周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- 201871020225-牟星源《面向对象程序设计(java)》第十五周学习总结
201871020225-牟星源<面向对象程序设计(java)>第十五周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
随机推荐
- Azure 网站上的 Java
编辑人员注释:本文章由Windows Azure 网站团队的项目经理Chris Compy 撰写. Microsoft 已推出针对 Azure 网站上基于 Java 的网站的支持.此功能旨在通过 ...
- API各函数作用简介
API各函数作用简介 1.控件与消息函数 AdjustWindowRect 给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小 AnyPopup 判断屏幕上是否存在任何弹出式窗口 ArrangeI ...
- HTML5 RPG游戏示例
演示地址 点击打开链接
- Codeforce 424C Magic Formulas 找规律
题目链接:http://codeforces.com/contest/424/problem/C 题意:求Q值 思路:找规律 显然能够得到一个矩阵 把这个矩阵画出来就能发现一个横向的规律和一个主对角线 ...
- 小猪猪C++笔记基础篇(五)表达式、语句
小猪猪C++笔记基础篇(五) 关键词:表达式.语句 本章的内容比较简单,基本上没有什么理解上的困难,都是知识上的问题.先开始想要不要写呢,本来是不准备写的,但是既然读了书就要做笔记,还是写一写,毕竟还 ...
- Javaweb统计在线人数的小栗子
最近在学习Javaweb相关的内容(不黑不吹之前对web开发零基础),下面通过一个统计在线人数的小栗子讲讲Servlet监听器吧 开发环境 eclipse tomcat 7 先说说这个小栗子的构思: ...
- Linux内核学习笔记-2.进程管理
原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- 一个Sqrt函数引发的血案(转)
作者: 码农1946 来源: 博客园 发布时间: 2013-10-09 11:37 阅读: 4556 次 推荐: 41 原文链接 [收藏] 好吧,我承认我标题党了,不过既然你来了, ...
- oracle整体知识的大致介绍(1)-概念
表空间: oracle允许不同类型的数据分开存放,表空间是数据库的逻辑划分. 数据文件: 表空间由同一磁盘上的一个或多个文件组成,这些文件叫做数据文件. 实例: 是存放和控制数据库的软件机制. ora ...
- Linux下使用ps命令来查看Oracle相关的进程
Linux下可以使用ps命令来查看Oracle相关的进程 Oracle Listener 这个命令会列出Oracle Net Listener的进程 [oracle@ www.linuxidc.com ...