模板和 I/O流主要内容
模板的概念
函数模板的定义
模板函数的生成
区分类模板和模板类
类模板的定义和使用模板
int f(int x,int y) {return (x+y);}
double f(double x,double y) {return (x+y);}
float f(float x,float y) {return (x+y);}
数学抽象:
T add(T x,T y) { return x+y; }
什么是模板?
模板是对具有 相同特性的函数或类 的再抽象。 C++面向对象技术中 更高一级的抽象 和 参数性多态 的体现。
模板并非一个实实在在的函数或者类,而是关于函数和类的描述。 使用时,需要对参数实例化,构造出具体的函数和类。这一步 由编译系统自动完成 。
模板与它的实例模板
(函数模板或类模板)
模板函数 模板类 对象实例化 实例化实例化
T add(T x,T y) { return x+y; }
int f(int x,int y) {return (x+y);}
double f(double x,double y) {return (x+y);}
float f(float x,float y) {return (x+y);}
函数模板模板函数实例化系统隐式生成函数模板
--参数化的函数称为函数模板定义格式:
template <模板参数表 >
<返回值类型 > <函数名 >(<参数表 >)
{
<函数体 >
}
至少一个说明:
参数表必须至少有一个参数说明,并且 <模板参数表
>中的每个模板参数都必须在 <参数表 >中得到使用。
<模板参数表 >中的一项均由关键字 class开始,表示一种数据类型,在使用函数模板时必须将其实例化。
函数模板的定义知识一种说明,不是一个具体的函数。
编译系统不为其产生任何执行代码 。只有当编译器发现一个具体的函数调用时,才根据具体的参数类型产生相应的代码,这部分代码称为 模板函数 。它是函数模板的 一个具体实例 。
模板函数的生成由编译系统隐式生成,其实质是函数重载。
class A
{
public:
A(int y):x(y) { }
int fn() {return x*x*x;}
};
private:
int x;
class B
{
public:
B(int y):x(y) { }
int fn() {return x*x*x;}
};
private:
int x;
class B
{
public:
B(T y):x(y) { }
T fn() {return x*x*x;}
};
private:
T x;
template <class T>;
类模板
--参数化的类称为类模板,它使得类中的某些数据成员、某些成员函数的参数或返回值能取任意类型。
template <类型参数表 >
class <类模板名 >
{
<类成员的声明 >
};
定义格式:
模板类类模板和它的实例类模板 模板类关系 数学模型 模型的实例创建代码 否 是数据类型 否 是实例化格式
模板类:
模板类对象:
<类模板名 > <实际的类型 >;
<类模板名 > <实际的类型 > <对象名 >[(实参表 )];
例:示例模板类
STL简介
oSTL是 Standard Template Library的缩写,
即标准模板库。它是由泛型算法和数据结构组成的通用库。
oSTL是 C++ 标准库中的重要一员,利用
STL开发程序可以提高代码的重用性,让程序更加稳定,便于维护,提高编写程序的效率。
o在运用 STL之前,必须掌握模板的使用。
STL主要由六大部分组成:
迭代器 ( iterators)
算法 ( algorithms)
容器 ( containers)
函数对象 ( function objects)
内存分配器 ( allocators)
适配器 ( adapter)
STL的组成例:示例 STL的容器和算法,对数组里的三个数求倒序。
I/O流什么是 I/O流计算机内存 计算机外设字符序列提取操作插入操作在 C++中,将数据从一个对象到另一个对象的流动抽象为,流,。流动的方向不同,构成输入 /输出流,即 I/O流 。
与输入设备 (键盘 )相联系的流称为输入流,
与输出设备 (屏幕 )相联系的流称为输出流。
数据的输入、输出通过 IO流来实现的。
什么是 I/O流
stdiostream
ios
istrstream
istream
ifstream
istream_withassign
ostream fstream
ostream_withassign
strstream
iostream
ofstream
ostrstream
streambuf
strstreambuf
filebuf
stdiobuf
fstreambase
strstreambase
非格式化输入输出
非格式化输入 /输出就是按系统预定义的格式进行的输入 /输出。
按默认约定,每个 C++程序都能使用标准
I/O流,如标准输入、标准输出。
cin用来处理标准输入,即键盘输入;
cout用来处理标准输出,即屏幕输出。它们被定义在 iostream.h头文件中。
在使用 cout和 cin前,要用编译预处理命令将所使用的头文件包含到源程序中。
,<<”是预定义的插入运算符,作用在流类对象 cout
上,实现默认格式的屏幕输出。使用 cout输出表达式值到屏幕上的格式如下:
cout<<E1<<E2<<…<<Em;
其中,E1,E2,…,Em为均为表达式。功能是计算各表达式的值,并将结果输出到屏幕当前光标位置处。
cout是 ostream流类的对象,它在 iostream.h头文件中作为全局对象定义:
ostream cout(stdout);
其中,stdout表示标准输出设备名(屏幕)。
非格式化输出非格式化输入
,>>”是预定义的提取运算符,作用在流类对象 cin上,
实现默认格式的键盘输入。使用 cin将数据输入到变量的格式如下:
cin>>V1>>V2>>…>>Vn;
其中,V1,V2,…,Vn都是变量。功能是暂停执行程序,
等待用户从键盘输入数据,各数据间用空格或 Tab键分隔,
输入数据类型要与接受变量类型一致,输完后,按回车键结束。
cin是 istream流类的对象,它在 iostream.h头文件中作为全局对象定义:
istream cin(stdin);
其中,stdin表示标准输入设备名(键盘)。
格式化输入输出
--格式化输入、输出主要用于控制 状态标志、
输出宽度、填充字符、输出精度 。
状态标志:输入、输出格式由各种状态标志来确定,它们是定义在 ios类中的 枚举量,
引用时必须包含 ios::前缀。
用 ios类成员函数格式化输出某公司部分商品本月的销售情况:
品名 单价 销售额 月盈亏海飞丝 18.5 15835.7 +4307
飘柔 13.5 3890.3 -880
cout<<“海飞丝:,<<
要求:单价前显示 *、销售额用科学记数法表示
(3位精度 ),能用正负号显示月盈亏。
ios类三个重要成员函数
设置状态标志用 setf函数设置状态标志,其一般格式如下:
long ios::setf(long flags)
清除状态标志用 unsetf函数清除状态标志,其一般格式如下:
long ios::unsetf(long flags)
取状态标志用函数 flaps取状态标志有两种形式,其格式分别如下:
long ios:,flags()
long ios::flags(long flag)
void main()
{
}
cout<<"海飞丝,";
cout.width(5); //设置单价 18.5显示宽度为 5个字符
cout.fill(?*?); //宽度不满用 *字符填充
cout<<18.5<<,”; //按照上面的格式设置输出
cout.setf(ios::scientific); //用科学记数法输出销售额
cout.precision(3); //保留 3位精度
cout<<15835.7<<,”;
//显示数的正负号、左对齐
cout.setf(ios::showpos|ios::left);
cout<<4307<<endl;
用 ios成员函数设置输出宽度
设置输出宽度函数有两种形式,其格式分别如下:
int ios::width(int len)
int ios::width()
第一种形式是设置输出宽度,并返回原来的输出宽度;第二种形式是返回当前输出宽度,输出宽度为 0。
设置填充字符填充字符的作用是当输出值不满输出宽度时用填充字符来填充,默认填充字符为空格。它与 width()
函数配合使用,否则没有意义。
设置填充字符函数有两种形式,其格式分别如下:
char ios::fill(char ch)
char ios::fill()
第一种形式是重新设置填充字符,并返回设置前的填充字符;第二种形式是返回当前的填充字符。
设置输出精度
设置浮点数输出精度有两种形式,其格式分别如下:
int ios::precision(int p)
int ios::precision()
第一种形式是重新设置输出精度,并返回设置前的输出精度;第二种形式是返回当前的输出精度。
用操作符函数格式化
为了不直接以标志位的方式去处理流的状态,c++标准库提供了标准的操作符函数专门操控这些状态。
这组函数不属于任何类成员,定义在
iomanip.h头文件中。
将它们用在提取运算符,>>” 或插入运算符,<<” 后面来设定输入 /输出格式,即在读写对象之间插入一个修改状态的操作。
其中有些函数没有参数,所以又叫操作符。
设置输入 /输出宽度函数 setw(int)
设置输出填充字符函数 setfill(int)
设置输出精度函数 setprecision(int)
设置输入 /输出整型数数制函数 dec,hex和
oct
取消输入结束符函数 ws
控制换行操作符 endl
代表输出单字符,\0” 的操作符 ends