1、9.1 C+对对C的一般扩充的一般扩充9.2 C+中的函数中的函数9.3 C+的输入与输出流的输入与输出流9.4 小结小结 C+在在C语言标识符的基础上,增加了许多标识语言标识符的基础上,增加了许多标识符,下面列出常用的标识符。符,下面列出常用的标识符。asm catch class delete friend inline new operator private protected public template virtual 特别注意,在将原来用特别注意,在将原来用C语言写的程序用语言写的程序用C+编编译之前,应把与上述关键字同名的标识符改名。译之前,应把与上述关键字同名的标识符改名。
2、9.1.19.1.1新增的关键字新增的关键字l在在C语言中,我们用语言中,我们用“/*”及及“*/”作为注释分界作为注释分界符号,符号,C+除了保留这种注释方式外,还提供了除了保留这种注释方式外,还提供了一种更有效的注释方式,即用一种更有效的注释方式,即用“/”导引出单行导引出单行注释。例如:注释。例如:int x;/*定义一个整型变量定义一个整型变量*/int x;/定义一个整型变量定义一个整型变量l这两条语句是等价的。这两条语句是等价的。C+的的“/”注释方式注释方式特别适合于注释内容不超过一行的注释,这使特别适合于注释内容不超过一行的注释,这使语句显得很简洁。语句显得很简洁。lC+支持两
3、种不同的类型转换形式:支持两种不同的类型转换形式:int i=0;long l=(long)I;/C的类型转换的类型转换 long m=long(i);/C+的新风格的新风格lC+新风格的类型转换形式看上去象是一个函数新风格的类型转换形式看上去象是一个函数调用,所以可读性较好。而且,这种形式也适调用,所以可读性较好。而且,这种形式也适合于用户定义类型的转换(用定义函数来实合于用户定义类型的转换(用定义函数来实现)。现)。在在C语言中,局部变量说明必须置于可执行语言中,局部变量说明必须置于可执行代码段之前,不允许局部变量说明和可执行代码段之前,不允许局部变量说明和可执行代码混合起来。但在代码混合
4、起来。但在C+中,允许在代码块中,允许在代码块的任何地方说明局部变量,也就是说,变量的任何地方说明局部变量,也就是说,变量可以放在任何语句位置,不必非放在程序段可以放在任何语句位置,不必非放在程序段的开始处。的开始处。例如:例如:void f()int i;i=1;int j;j=2;/这样,可以这样,可以随用随定义随用随定义,这也是,这也是C+封装的要封装的要求,易读性也好。而且在远离数据项被使用处求,易读性也好。而且在远离数据项被使用处的地方声明,易引起混淆或导致错误。的地方声明,易引起混淆或导致错误。1.const定义常量定义常量l在在C中,习惯使用中,习惯使用#define来定义常量,
5、例如:来定义常量,例如:#define SIZE 100;lC+提供了一种更灵活、更安全的方式来定义提供了一种更灵活、更安全的方式来定义变量,即使用类型限定符变量,即使用类型限定符 const 来表示常量。来表示常量。所以,所以,C+中的常量可以是有类型的,程序员中的常量可以是有类型的,程序员不必再用不必再用#define创建无类型常量。例如:创建无类型常量。例如:const int size=100;l声明成声明成const的变量,实际是常量,它有地址,的变量,实际是常量,它有地址,可以用指针指向这个值,但在程序中是不可修可以用指针指向这个值,但在程序中是不可修改的。改的。l使用使用#def
6、ine有时是不安全的,如下例所示。有时是不安全的,如下例所示。【例例9.1】使用使用#define引起的歧义。引起的歧义。#include void main()int a=1;#define T1 a+a#define T2 T1-T1coutT2 is T2endl;初看程序,似乎应输出初看程序,似乎应输出:T2 is 0但是实际的输出结果是但是实际的输出结果是:T2 is 2【例例9.2】使用使用const消除消除#define的不安全性的不安全性#include void main()int a=1;const T1=a+a;const T2=T1-T1;coutT2 is T2end
7、l;程序执行结果如下程序执行结果如下:T2 is 02.const修饰指针修饰指针const还可以修饰指针的情况,例如:还可以修饰指针的情况,例如:int b=500;const int*a=&b;int const*a=&b;int*const a=&b;const int*const a=&b;lconst修饰指针的情况可以有以上几种形修饰指针的情况可以有以上几种形式,和的情况相同,都是指针所指向式,和的情况相同,都是指针所指向的内容为常量,这种情况下不允许对指针的内容为常量,这种情况下不允许对指针指向的内容进行更改操作,如不能:指向的内容进行更改操作,如不能:*a=3;l但是,由于但是,
8、由于a是一个指向常量的普通指针是一个指向常量的普通指针变量,不是常指针,因此可以改变变量,不是常指针,因此可以改变a的值,的值,例如下列语句是允许的:例如下列语句是允许的:int c=3;a=&c;l上述为指针本身是常量,即常指针,而指针上述为指针本身是常量,即常指针,而指针所指向的内容不是常量,这种情况下不能对指所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,例如:针本身进行更改操作,例如:a+;/非法非法l但是它指向的数据可以改变,例如:但是它指向的数据可以改变,例如:*a=3;/合法合法是可以的。是可以的。l上述为指针本身和指向的内容均为常量,均上述为指针本身和指向的内容均为
9、常量,均不能修改。不难理解以下两个语句都是错误的:不能修改。不难理解以下两个语句都是错误的:a+;/非法非法 *a=3;/非法非法3.const在函数中的应用在函数中的应用lconst还常用来限定函数的参数和返回值。函数还常用来限定函数的参数和返回值。函数参数如果使用参数如果使用const声明,说明在函数中声明,说明在函数中不能修不能修改该参数改该参数。例如:。例如:float fun(const float x)return x*x;/非法:非法:x=x*x;l如果函数返回基本类型(如如果函数返回基本类型(如int和和double),用),用const声明返回值没有特别的意义,但如果函数声明
10、返回值没有特别的意义,但如果函数返回一个指针或引用(引用的概念在后面提返回一个指针或引用(引用的概念在后面提及),则使用及),则使用const声明返回值声明返回值表示调用函数时表示调用函数时不能用返回值不能用返回值来来改变改变返回值所返回值所指向或引用的变指向或引用的变量量。例如。例如:const int*fun()static int x=1;+x;return&x;void main()int y;y=*fun();/合法:将值合法:将值x赋值给赋值给y*fun()=2;/非法:不能改变一个常量的类型非法:不能改变一个常量的类型C+的的struct后的标识符可看作是类型名,所以后的标识符可
11、看作是类型名,所以定义某个变量比定义某个变量比C中更加直观。例如,在中更加直观。例如,在C中:中:struct point int x;int y;struct point p;而在而在C+中:中:struct point int x;int y;point p;我们不必再写我们不必再写struct。对于。对于union,也可以照此,也可以照此使用。使用。l“:”是作用域分辨运算符,它用于访问在是作用域分辨运算符,它用于访问在当前作用域中被隐藏的数据项。如果有两当前作用域中被隐藏的数据项。如果有两个同名变量,一个是全局的,另一个是局个同名变量,一个是全局的,另一个是局部的,那么局部变量在其作用
12、域内具有较部的,那么局部变量在其作用域内具有较高的优先权。高的优先权。【例例9.3】局部变量在其作用域内具有较高的优先权局部变量在其作用域内具有较高的优先权。#include int a=10;/全局变量全局变量aint main()int a;a=25;/局部变量局部变量acouta is aendl;return 0;程序执行结果如下程序执行结果如下:a is 25【例例9.4】使用域作用运算符使用域作用运算符#include int a;/全局变量全局变量aint main()int a;a=25;/局部变量局部变量a:a=10;/全局变量全局变量acoutlocal is aendl;
13、coutglobal is:aendl;return 0;程序执行结果如下程序执行结果如下:local is 25global is 109.1.8 C+的动态内存分配的动态内存分配lC程序中,动态内存分配是通过调用程序中,动态内存分配是通过调用malloc()和和free()等库函数来实现的,而等库函数来实现的,而C+给出了使用给出了使用new 和和delete运算符进行动态内存分配的新方法。运算符进行动态内存分配的新方法。例例9.5 用用malloc()实现内存分配。实现内存分配。#include#include void main()int*p;p=(int*)malloc(sizeof
14、(int);*p=10;printf(%d,*p);free(p);l运算符运算符new用于内存分配的使用形式为:用于内存分配的使用形式为:p=new type;其中,其中,type是一个数据类型名,是一个数据类型名,p是指向该数据是指向该数据类型的指针。类型的指针。new从内存中为程序分配一块从内存中为程序分配一块sizeof(type)字节大小的内存,该块内存的首地字节大小的内存,该块内存的首地址存于指针址存于指针p中。中。l运算符运算符delete用于释放用于释放new分配的存储空间,它分配的存储空间,它的使用形式为:的使用形式为:delete p;l其中,其中,p必须是一个指针,保存着
15、必须是一个指针,保存着new分配的内分配的内存的首地址。以下是存的首地址。以下是C+程序中用新方法实现动程序中用新方法实现动态内存分配的例子。态内存分配的例子。【例例9.6】用用new实现动态内存分配实现动态内存分配#include void main()int*i=new int;/为指针为指针i分配存储空间分配存储空间*i=10;cout*i;delete i;/释放释放i指向的存储空间指向的存储空间说明:说明:(1)使用)使用new可以为数组动态分配存储空可以为数组动态分配存储空间,这时需要在类型名后缀上数组的大小。间,这时需要在类型名后缀上数组的大小。例如:例如:int*p=new i
16、nt10;这时这时new为具有为具有10个元素的整型数组分个元素的整型数组分配了内存空间,并将首地址赋给了指针配了内存空间,并将首地址赋给了指针p。需要注意的是,使用需要注意的是,使用new给多维数组分配给多维数组分配空间时,必须提供所有维的大小,如:空间时,必须提供所有维的大小,如:int*p=new int234;其中第一维的界值可以是任何合法的表达其中第一维的界值可以是任何合法的表达式。式。int i=3;int*p=new inti34;(2)new可以在为简单变量分配内存的同可以在为简单变量分配内存的同时,进行初始化。例如:时,进行初始化。例如:int*p=new int(99);n
17、ew分配了一个整型内存空间,并赋初始分配了一个整型内存空间,并赋初始值值99。但是,但是,new不能对动态分配的数组存储区不能对动态分配的数组存储区进行初始化。进行初始化。(3)释放动态分配的数组存储区时,可用)释放动态分配的数组存储区时,可用如下的如下的delete格式:格式:delete p;(4)使用)使用new动态分配内存时,如果分配动态分配内存时,如果分配失败,既没有足够的内存空间满足分配要失败,既没有足够的内存空间满足分配要求,求,new将返回空指针(将返回空指针(NULL)。因此)。因此通常要对内存的动态分配是否成功进行检通常要对内存的动态分配是否成功进行检查。查。int mai
18、n()int*p=new int;/为指针为指针p分配存储空间分配存储空间 if(!p)cout分配失败分配失败endl;return 1;*p=10;cout*p;delete p;/释放释放p指向的存储空间指向的存储空间 return 0;在前面在前面的的章节中,我们学习了指针的章节中,我们学习了指针的概念,指针就是内存单元的地址,它可能概念,指针就是内存单元的地址,它可能是变量的地址,也可能是函数的入口地址。是变量的地址,也可能是函数的入口地址。这里看另外一个同指针相关的概念:引用。这里看另外一个同指针相关的概念:引用。在引入引用的在引入引用的 概念之前,我们先看一个概念之前,我们先看一
19、个例子。例子。#include void swap(int m,int n)int temp;temp=m;m=n;n=temp;int main()int a=5,b=10;couta=a;coutb=bendl;swap(a,b);couta=a;coutb=bendl;return 0;程序执行结果如下程序执行结果如下:a=5 b=10a=5 b=10#include void swap(int*m,int*n)int temp;temp=*m;*m=*n;*n=temp;int main()int a=5,b=10;couta=a;cout b=bendl;swap(&a,&b);co
20、uta=a;cout b=bendl;return 0;程序执行结果如下程序执行结果如下:a=5 b=10a=10 b=5l引用是能自动间接引用的一种指针。自动引用是能自动间接引用的一种指针。自动间接引用就是不必使用间接引用运算符,间接引用就是不必使用间接引用运算符,就可以得到一个引用值。就可以得到一个引用值。l我们可以这样理解,引用就是某一变量我们可以这样理解,引用就是某一变量(目标)的一个别名,对引用的操作与对(目标)的一个别名,对引用的操作与对变量直接操作完全一样。那么,在程序设变量直接操作完全一样。那么,在程序设计的时候,引用如何定义并使用呢?计的时候,引用如何定义并使用呢?1.引用的
21、定义引用的定义定义引用的关键字是定义引用的关键字是“type&”,它的含义是,它的含义是“type类型的引用类型的引用”,此引用与,此引用与type类型的对象类型的对象或变量的地址相联系。例如:或变量的地址相联系。例如:int i=5;int&j=i;它创建了一个整型引用,它创建了一个整型引用,j是是i的别名,的别名,i和和j占用内占用内存同一位置。当存同一位置。当i变化时,变化时,j也随之变化,反之亦然。也随之变化,反之亦然。引用的初始值可以是一个变量或另一个引用,引用的初始值可以是一个变量或另一个引用,以下的定义也正确。以下的定义也正确。int i=5;int&j=i;int&j1=j;2
22、.使用规则使用规则(1)定义引用时,必须立即初始化。)定义引用时,必须立即初始化。int i;int&j;/错误,没有初始化错误,没有初始化j=i;(2)引用不可重新赋值。)引用不可重新赋值。int i,k;int&j=i;j=&k;/错误,重新赋值错误,重新赋值(3)引用不同于普通变量,下面的声明是非法的:)引用不同于普通变量,下面的声明是非法的:int&b3;/不能建立引用数组不能建立引用数组int&*P;/不能建立指向引用的指针不能建立指向引用的指针int&r;/不能建立指向引用的引用不能建立指向引用的引用(4)当使用运算符取一个引用的地址时,其值)当使用运算符取一个引用的地址时,其值为
23、所引用的变量的地址。为所引用的变量的地址。int num=50;int&ref=num;int*p=&ref;则则p中保存的是变量中保存的是变量num的地址。的地址。#include void swap(int&m,int&n)int temp;temp=m;m=n;n=temp;main()int a=5,b=10;couta=a;cout b=bendl;swap(a,b);couta=a;cout b=btest C:test a.ca.c b.cb.c t.ct.c 则则 argcargc=4=4,argvargv0=test0=test,argvargv1=1=a.ca.c,argv
24、argv2=2=b.cb.c,argvargv3=3=t.ct.c。如果如果main()main()前面不写返回类型,那么前面不写返回类型,那么main()main()等价于等价于 intint main()main()函数要求具有函数要求具有intint返回类型,如例返回类型,如例9.99.9。9.2.2 函数定义函数定义lC+函数定义中的参数说明必须放在函数名后的函数定义中的参数说明必须放在函数名后的括号内,不可将函数参数说明放在函数说明部括号内,不可将函数参数说明放在函数说明部分与函数体之间,如:分与函数体之间,如:void fun(a)int a;/错误的参数说明方式错误的参数说明方式
25、 l但在但在C中,这种说明方法是允许的。中,这种说明方法是允许的。9.2.3 内置函数内置函数l函数调用导致了一定数量的额外开销,如函数调用导致了一定数量的额外开销,如参数入栈、出栈等。有时,正是这种额外参数入栈、出栈等。有时,正是这种额外开销迫使开销迫使C程序员在整个程序中复制代码程序员在整个程序中复制代码以提高效率。以提高效率。C+的内置函数正是为了解的内置函数正是为了解决这一问题而提供的。决这一问题而提供的。l当函数定义是由当函数定义是由inline开头时,表明此函开头时,表明此函数为内置函数。编译时,使用函数体中的数为内置函数。编译时,使用函数体中的代码替代函数调用表达式,从而完成与函
26、代码替代函数调用表达式,从而完成与函数调用相同的功能,这样,能加快代码的数调用相同的功能,这样,能加快代码的执行,减少调用开销。执行,减少调用开销。l例如:例如:inline int sum(int a,int b)/内置函数内置函数 return a+b;l说明:说明:内置函数必须在它被调用之前定义,否则内置函数必须在它被调用之前定义,否则编译不会得到预想的结果。编译不会得到预想的结果。若内置函数较长,且调用太频繁时,程序若内置函数较长,且调用太频繁时,程序将加长很多,通常只有较短的函数才定义将加长很多,通常只有较短的函数才定义为内置函数,较长的函数最好作为一般函为内置函数,较长的函数最好作
27、为一般函数处理。数处理。C+对对C函数的一大重要的改进之一就是可以为函数的一大重要的改进之一就是可以为函数定义缺省的参数值。例如:函数定义缺省的参数值。例如:int fun(int x=5,int y=10);/函数原型,给出缺省的参数值函数原型,给出缺省的参数值 x与与y的值分别是的值分别是5和和10。当进行函数调用时,编译器按从左向右顺序将实当进行函数调用时,编译器按从左向右顺序将实参与形参结合,若未指定足够的实参,则编译器参与形参结合,若未指定足够的实参,则编译器按顺序用函数原型中的缺省值来补足所缺少的实按顺序用函数原型中的缺省值来补足所缺少的实参。例如:参。例如:fun(1,2);/x
28、=1,y=2 fun(1);/x=1,y=10 fun();/x=5,y=10l一个一个C+函数可以有多个缺省参数,并且函数可以有多个缺省参数,并且C+要求要求缺省参数必须连续的放在函数参数表的尾部,也就缺省参数必须连续的放在函数参数表的尾部,也就是说,所有取缺省值的参数都必须出现在不取缺省是说,所有取缺省值的参数都必须出现在不取缺省值的参数的右边。当调用具有多个缺省参数时,若值的参数的右边。当调用具有多个缺省参数时,若某个参数省略,则其后的参数皆应省略而采用缺省某个参数省略,则其后的参数皆应省略而采用缺省值。当不允许出现某个参数省略时,再对其后的参值。当不允许出现某个参数省略时,再对其后的参
29、数指定参数值。例如:数指定参数值。例如:fun(,5)/这种调用方式是错误的这种调用方式是错误的l在在C语言中,函数名必须是唯一的,也就是说不语言中,函数名必须是唯一的,也就是说不允许出现同名的函数。当要求编写求整数、浮点允许出现同名的函数。当要求编写求整数、浮点数和双精度浮点数的立方数的函数时,若用数和双精度浮点数的立方数的函数时,若用C语语言来处理,必须编写三个函数,这三个函数的函言来处理,必须编写三个函数,这三个函数的函数名不允许同名。例如:数名不允许同名。例如:lIcube(int i);/求整数的三次方求整数的三次方lFcube(float f);/求浮点数的三次方求浮点数的三次方l
30、Dcube(double i);/求双精度浮点数的三次方求双精度浮点数的三次方l在在C+中,用户可以重载函数,这意味着,中,用户可以重载函数,这意味着,只要函数参数的类型不同,或者参数的个只要函数参数的类型不同,或者参数的个数不同,数不同,两个或两个以上的函数可以使用两个或两个以上的函数可以使用相同的函数名。相同的函数名。#include int cube(int i)return i*i*i;float cube(float f)return f*f*f;double cube(double d)return d*d*d;int main()int i=12;float f=3.4;doub
31、le d=5.678;couti*i*i=cube(i)endl;coutf*f*f=cube(f)endl;coutd*d*d=cube(d)i;cout”是输入是输入运算符,表示从标准输入流(即键盘)读取的运算符,表示从标准输入流(即键盘)读取的数值传送给右方指定的变量。运算符数值传送给右方指定的变量。运算符“”允允许用户连续读入一连串数据,两个数据间用空许用户连续读入一连串数据,两个数据间用空格、回车或格、回车或Tab键分隔。例如:键分隔。例如:cinxy;coutlcout是标准的输出流,在程序中用于代表是标准的输出流,在程序中用于代表标准输出设备,通常指屏幕。运算符标准输出设备,通常
32、指屏幕。运算符“”是输出运算符,表示将右方变量的是输出运算符,表示将右方变量的值显示到屏幕上。运算符值显示到屏幕上。运算符“”允许用户允许用户连续输出数据。例如:连续输出数据。例如:coutxy;l这里的变量应该是基本数据类型,不能是这里的变量应该是基本数据类型,不能是void型。型。l为了支持类的概念,为了支持类的概念,C+系统建立了一个系统建立了一个可扩展可扩展的输入输出系统的输入输出系统,它可以通过修改和扩展来加,它可以通过修改和扩展来加入用户自定义类型并进行相应操作。入用户自定义类型并进行相应操作。l例如,在例如,在C语言中有下面结构类型变量的定义:语言中有下面结构类型变量的定义:st
33、ruct point int x,y;a;l这里,无法延伸这里,无法延伸C语言的语言的I/O系统,使之直接在系统,使之直接在变量变量a上执行上执行I/O操作,如下面的用法是错误的:操作,如下面的用法是错误的:printf(%point,a);9.3.1 C+的流类结构的流类结构l虽然,虽然,C+语言和语言和C语言的语言的I/O系统有着显系统有着显著的差异,但它们也有着共同之处,即都著的差异,但它们也有着共同之处,即都是对是对流流(tream)进行操作。流实际上就)进行操作。流实际上就是一个字节序列。输入操作中,字节从输是一个字节序列。输入操作中,字节从输入设备(如键盘、磁盘、网络连接等)流入设
34、备(如键盘、磁盘、网络连接等)流向内存;输出操作中,字节从内存流向输向内存;输出操作中,字节从内存流向输出设备。出设备。l使用使用C+的的I/O的系统必须包含头文件的系统必须包含头文件iostream.h,对某些流函数可能还需要其,对某些流函数可能还需要其他头文件,例如进行文件他头文件,例如进行文件I/O时需要头文时需要头文件件fstream.h。l1.iostream库库liostream库中具有库中具有streambuf和和ios两个两个平行的类,这都是基本的类,分别完成不平行的类,这都是基本的类,分别完成不同的工作。同的工作。streambuf类提供基本流操作类提供基本流操作,但不提供格
35、式支持。,但不提供格式支持。ios类为格式化类为格式化I/O提供基本操作。提供基本操作。l2.标准流标准流liostream.h说明了标准流对象说明了标准流对象cin、cout、cerr与与clog。cin是标准输入流,对应是标准输入流,对应于于C语言的语言的stdin;cout是标准输出流,对是标准输出流,对应于应于C语言的语言的stdout;cerr是标准出错信是标准出错信息输出,息输出,clog是带缓冲的标准出错信息输是带缓冲的标准出错信息输出。出。cerr和和clog流被连到标准输出设备上流被连到标准输出设备上,对应于,对应于C语言的语言的stderr。cerr和和clog之之间的区别
36、是间的区别是cerr没有缓冲,发送给它的任没有缓冲,发送给它的任何输出立即被执行,而何输出立即被执行,而clog只有当缓冲区只有当缓冲区满时才有输出。缺省时,满时才有输出。缺省时,C+语言标准流语言标准流被连到控制台上。被连到控制台上。9.3.2格式化格式化I/O1.状态标志字状态标志字lenuml skipws=0 x0001,left=0 x0002,right=0 x0004,internal=0 x0008,dec=0 x0010,oct=0 x0020,hex=0 x0040,showbase=0 x0080,showpoint=0 x0100,uppercase=0 x0200,s
37、howpos=0 x0400,scientific=0 x0800,fixed=0 x1000,unitbuf=0 x2000,stdio=0 x4000,l2.ios类中用于控制输入输出格式的成员函数类中用于控制输入输出格式的成员函数(1)设置状态标志)设置状态标志setf(long flags)。(2)清除状态标志)清除状态标志unsetf()。(3)取状态标志)取状态标志flags()。(4)设置域宽)设置域宽width()。(5)设置显示的精度)设置显示的精度precision(int num);(6)填充字符)填充字符fill()。【例例9.11】设置状态标志。设置状态标志。#inc
38、lude void main()cout.setf(ios:showpos|ios:scientific);cout123 123.456endl;【例例9.12】使用使用ios类中用于控制输入输出格式的成员类中用于控制输入输出格式的成员函数函数#includevoid main()coutx_width=cout.width()endl;coutx_fill=cout.fill()endl;coutx_precision=cout.precision()endl;cout123 123.45678endl;cout-endl;cout*x_width=10,x_fill=&,x_precis
39、ion=4*endl;cout.fill(&);cout.width(10);cout.setf(ios:scientific);cout.precision(4);cout123 123.45678endl;cout.setf(ios:left);cout.width(10);cout123 123.45678endl;coutx_width=cout.width()endl;coutx_fill=cout.fill()endl;coutx_precision=cout.precision()endl;3.用操作子进行格式化用操作子进行格式化lC+流类库所定义操作子如下:流类库所定义操作子如
40、下:ldec,hex,oct:数值数据采用十进制、十六进制、数值数据采用十进制、十六进制、八进制表示,可用于输入或输出。八进制表示,可用于输入或输出。lws:提取空白符,仅用于输入。提取空白符,仅用于输入。lendl:插入一个换行符并刷新输出流,仅用于输出。插入一个换行符并刷新输出流,仅用于输出。lends:插入空字符,仅用于输出。插入空字符,仅用于输出。lflush:刷新与流相关联的缓冲区,仅用于输出。刷新与流相关联的缓冲区,仅用于输出。lsetbase(int n):设置数值转换基数为设置数值转换基数为n(n的取的取值为值为0、8、10、16),0表示使用缺省基数,即表示使用缺省基数,即以
41、十进制形式输出。以十进制形式输出。lresetiosflags(long f):清除参数清除参数f所指定的标志所指定的标志位,可用于输入或输出。位,可用于输入或输出。lsetiosflags(long f):设置参数设置参数f所指定的标志位所指定的标志位,可用于输入或输出。,可用于输入或输出。lsetfill(int n):设置填充字符,缺省为空格,可设置填充字符,缺省为空格,可用于输入或输出。用于输入或输出。lsetsprecision(int n):设置浮点数输出的有效设置浮点数输出的有效数字个数,可用于输入或输出。数字个数,可用于输入或输出。lsetw(int n):设置输出数据项的域宽
42、,可用于设置输出数据项的域宽,可用于输入或输出。输入或输出。例例9.13 使用操作子进行格式化。使用操作子进行格式化。#include#includevoid main()coutsetw(10)123456endl;/cout123setiosflags(ios:scientific)setw(20)123.456789endl;/cout123setw(10)hex123endl;/cout123setw(10)oct123endl;/cout123setw(10)dec123endl;/coutresetiosflags(ios:scientific)setprecision(4)123
43、.456789endl;/coutsetiosflags(ios:left)setfill(#)setw(8)dec123endl;/coutresetiosflags(ios:left)setfill($)setw(8)dec456endl;/9.4 小结小结 本章主要介绍本章主要介绍C+对对C的非面向对象特性的非面向对象特性的扩展,包括新增的关键字、注释、类型的扩展,包括新增的关键字、注释、类型转换、灵活的变量声明、转换、灵活的变量声明、const、struct、作用域分辨运算符、作用域分辨运算符“:”、C+的动态内的动态内存分配、引用、主函数存分配、引用、主函数main、函数定义、函数定义、内置函数、缺省参数值、函数重载、内置函数、缺省参数值、函数重载、C+的输入与输出流等知识点,并给出了的输入与输出流等知识点,并给出了相应的实例。在应用相应的实例。在应用C+编程时,要对这编程时,要对这些知识点熟练掌握。些知识点熟练掌握。