C++对c的补充_第1页
C++对c的补充_第2页
C++对c的补充_第3页
C++对c的补充_第4页
C++对c的补充_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、主要内容2.5c+输入输出语句3.4C串与string3.6向量3.7引用5.6函数重载6.1内联函数2.5c+输入输出(1) 对系统指定的标准设备的输入和输出。即从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准I/O。(2) 以外存磁盘文件为对象进行输入和输出,即从磁盘文件输入数据,数据输出到磁盘文件。以外存文件为对象的输入输出称为文件的输入输出,简称文件I/O。(3) 对内存中指定的空间进行输入和输出。通常指定一个字符数组作为存储空间(实际上可以利用该空间存储任何信息)。这种输入和输出称为字符串输入输出,简称串I/O。C+的输入输出流 C+的输入输出流是指由若干字

2、节组成的字节序列,这些字节中的数据按顺序从一个对象传送到另一对象。流表示了信息从源到目的端的流动。在输入操作时,字节流从输入设备(如键盘、磁盘)流向内存,在输出操作时,字节流从内存流向输出设备(如屏幕、打印机、磁盘等)。流中的内容可以是ASCII字符、二进制形式的数据、图形图像、数字音频视频或其他形式的信息。 实际上,在内存中为每一个数据流开辟一个内存缓冲区,用来存放流中的数据。流是与内存缓冲区相对应的,或者说,缓冲区中的数据就是流。 在C+中,输入输出流被定义为类。C+的I/O库中的类称为流类(stream class)。用流类定义的对象称为流对象。 cout和cin并不是C+语言中提供的语

3、句,它们是iostream类的对象,在未学习类和对象时,在不致引起误解的前提下,为叙述方便,把它们称为cout语句和cin语句。C+编译系统提供了用于输入输出的iostream类库。iostream这个单词是由3个部分组成的,即i-o-stream,意为输入输出流。在iostream类库中包含许多用于输入输出的类。与iostream类库有关的头文件iostream包含了对输入输出流进行操作所需的基本信息。fstream用于用户管理的文件的I/O操作。strstream用于字符串流I/O。stdiostream用于混合使用C和C+的I/O机制时。iomanip在使用格式化I/O时应包含此头文件。

4、标准输出流1. cout流对象cout是console output的缩写,意为在控制台(终端显示器)的输出。2. cerr流对象cerr流对象是标准错误流。cerr流已被指定为与显示器关联。3. clog流对象clog流对象也是标准错误流,它是console log的缩写。它的作用和cerr相同,都是在终端显示器上显示出错信息。区别: cerr是不经过缓冲区,直接向显示器上输出有关信息,而clog中的信息存放在缓冲区中,缓冲区满后或遇endl时向显示器输出。Cout 格式:cout表达式表达式nendl是输出是的控制符,表示换行系统自动判别输出项的数据类型输出数据时,不能只用一个插入运算符“

5、”输出多个数据项所有类型的数据在输出时,数据间均无间隔,如需要,则需在数据间插入相应的间隔符输出多个表达式的值时,可以写成多个cout语句来实现例 用控制符控制输出格式。#include #include /不要忘记包含此头文件using namespace std;int main()int a; couta; coutdec:decaendl; /以十进制形式输出整数 couthex:hexaendl; /以十六进制形式输出整数a coutoct:setbase(8)aendl; /以八进制形式输出整数a char *pt=China; /pt指向字符串China coutsetw(10)

6、ptendl; /指定域宽为10,输出字符串coutsetfill(*)setw(10)ptendl; /指定域宽10,输出字符串,空白处以*填充 double pi=22.0/7.0; /计算pi值 coutsetiosflags(ios:scientific)setprecision(8);/按指数形式输出,8位小数 coutpi=piendl; /输出pi值 coutpi=setprecision(4)piendl; /改为4位小数 coutpi=setiosflags(ios:fixed)pi”从流中提取数据。cin 格式:cin变量1变量n1)输入任何数据时,空格符、制表符、回车符都

7、作为输入数据的间隔符2)输入数据时,变量时变量可以在同一个语句中,也可以分成多个语句3)系统会根据变量的类型从输入流中提取相应长度的字节4)还可以进行字符串数据的输入#include using namespace std;void main(void) char ch1,ch2,ch3; int a,b; float x,y; cinch1ch2ch3; cinab; cinxy; coutch1ch2ch3endl; couta bendl; coutx y endl; return 0;文件流的输入出操作与标准输入出基本相同,只是需要以一定方式打开和关闭如,将文件a.in打开,逐行读入字

8、符,输出到文件a.out: ifstream in(“a.in”); ofstream out(“a.out”); forfor(string s; getline(in, s); ) outsendl;其中文件流读入操作总是伴随着状态返回,判断状 态 就 可 以 确 定 文 件 是 否 正 常 读 入 , 如getline(in,s)当读到文件尾时,便返回false,以使循环结束3.4C串与string C+提供了一种新的数据类型字符串类型(string类型),在使用方法上,它和char、int类型一样,可以用来定义变量,这就是字符串变量用一个名字代表一个字符序列。 实际上,string并不

9、是C+语言本身具有的基本类型,它是在C+标准库中声明的一个字符串类,用这种类可以定义对象。每一个字符串变量都是string类的一个对象。1. 定义字符串变量 和其他类型变量一样,字符串变量必须先定义后使用,定义字符串变量要用类名string。如string string1; /定义string1为字符串变量string string2=China; /定义string2同时对其初始化应当注意: 要使用string类的功能时,必须在本文件的开头将C+标准库中的string头文件包含进来,即应加上#include /注意头文件名不是string.h2. 对字符串变量的赋值在定义了字符串变量后,可以

10、用赋值语句对它赋予一个字符串常量,如string1=Canada;既可以用字符串常量给字符串变量赋值,也可以用一个字符串变量给另一个字符串变量赋值。如 string2=string1; /假设string2和string1均已定义为字符串变量不要求string2和string1长度相同,假如string2原来是China,string1原来是Canada,赋值后string2也变成Canada。在定义字符串变量时不需指定长度,长度随其中的字符串长度而改变。3. 字符串变量的输入输出 可以在输入输出语句中用字符串变量名,输入输出字符串,如cin string1; /从键盘输入一个字符串给字符串变

11、量string1cout string2; /将字符串string2输出4字符串变量的运算字符串复制用赋值号字符串连接用加号字符串比较直接用关系运算符3.6向量 向量与数组的共同特征是元素的排列在逻辑上是线性序列结构,可以用下标进行访问 向量可以按需创建,拷贝创建,局部拷贝创建,异类拷贝和创建灵活的初始化 随意扩容和元素增减 可通过异常来进行下标溢出追踪和处理可比较 等等int n=10;int t5=1,2,3,4,5;vector a(n); /按需创建按需创建vector b(10, 1); /元素赋全,元素赋全,灵活的初始化灵活的初始化vector c(b); / 整体拷贝创建整体拷贝

12、创建vector f(t, t+5); /异类拷贝创异类拷贝创建建vector d(b.begin(), b.begin()+3);/局部拷贝创建局部拷贝创建d为为b的的前个元素前个元素a.assign(100); /动态扩容至100个元素向量常用操作a.assign(b.begin(), b.begin()+3); / b的前的前3个元素赋给个元素赋给aa.assign(4,2);/ a向量含向量含4个元素,全初个元素,全初始化为始化为2int x = a.back(); / a的最后一个元素赋的最后一个元素赋给变量给变量xa.clear(); / a向量清空(不再有元素)向量清空(不再有元

13、素)if(a.empty() cout”empty”; / a判空操作判空操作int y = a.front(); / a的第一个元素赋的第一个元素赋给变量给变量y向量常用操作a.pop_back(); / 删除a的最后一个元素a.push_back(5); / a最后插入一个元素,其值为5a.resize(10); / a元素个数调至10。多删少补,其值随机a.resize(10,2);/a元素个数调至10。多删少补,新添元素初值为2if(a=b) cout”equal”; / a与b的向量比较操作3.7引用 对变量起另外一个名字对变量起另外一个名字 (外号外号),这个名字称,这个名字称为该

14、变量的引用。为该变量的引用。 & = ; 其中其中原变量名原变量名必须是一个已定义过的变量必须是一个已定义过的变量。如:。如:int max ;int &refmax=max;refmax并没有重新在内存中开辟单元,只是并没有重新在内存中开辟单元,只是引引用用max的单元。的单元。max与与refmax在内存中占用同在内存中占用同一地址一地址,即同一地址两个名字即同一地址两个名字。int max ;int &refmax=max;max=5 ;refmax=10;refmax=max+refmax;maxrefmax51020max与与refmax同一地址同一地址1、引

15、用在定义的时候要初始化。、引用在定义的时候要初始化。int &refmax;int &refmax=max;2、对引用的操作就是对被引用的变、对引用的操作就是对被引用的变量的操作。量的操作。对引用类型的变量,说明以下几点:对引用类型的变量,说明以下几点:错误,没有具体的引用对象错误,没有具体的引用对象max是已定义过的变量是已定义过的变量3、 引用类型变量的初始化值不能是引用类型变量的初始化值不能是一个常数。一个常数。如:如:int &ref1 = 5; / 是错误的。是错误的。int &ref=i;4、引用同变量一样有地址,可以对、引用同变量一样有地址,可以对

16、其地址进行操作,即将其地址赋给其地址进行操作,即将其地址赋给一指针。一指针。int a, *p;int &m=a;p=&m;*p=10;指针与引用的区别:指针与引用的区别:1、指针是通过地址、指针是通过地址间接间接访问某个变访问某个变量,而引用是通过别名量,而引用是通过别名直接直接访问某访问某个变量。个变量。2、引用必须初始化,而、引用必须初始化,而一旦被初始一旦被初始化后不得再作为其它变量的别名化后不得再作为其它变量的别名。以下的声明是非法的以下的声明是非法的1、企图建立数组的引用、企图建立数组的引用 int & a9;2、企图建立指向引用的指针、企图建立指向引用的指

17、针 int & *p;3、企图建立引用的引用、企图建立引用的引用 int & &px;引用的用途主要是用来作引用的用途主要是用来作函数的参数函数的参数或或函数的返回值。函数的返回值。void change(int &x, int &y)/x,y是实参是实参a,b的别名的别名 int t; t=x; x=y; y=z;void main(void) int a=3,b=5; change(a,b); /实参为变量实参为变量 coutatbendl; const类型变量类型变量 当用const限制说明标识符时,表示所说明的数据类型为常量类型。可分为const

18、型常量和const型指针。可用const限制定义标识符量,如:const int MaxLine =1000;const float Pi=3.1415926 用const定义的标识符常量时,一定要对其初始化。在说明时进行初始化是对这种常量置值的唯一方法 ,不能用赋值运算符对这种常量进行赋值。如:MaxLine =35; const 型指针1)禁写指针声明语句格式为: 数据类型 * const 指针变量名如:int r=6; int * const pr=&r;则指针pr被禁写,即pr将始终指向一个地址,成为一个指针常量。它将不能再作为左值而放在赋值号的左边。void main(voi

19、d) int a,b; int *const pa=&a; /一定要赋初值,pa是常量,不能在程序中/被改变 *pa=10;/可以间接引用 pa=&b;/非法,pa为常量2)禁写间接引用声明语句格式如下: const 数据类型 *指针变量名;所声明的指针指向一禁写的实体,即间接引用不能被改写。如: const int *p;所以程序中不能出现诸如 *p= 的语句,但指针p并未被禁写,因而可对指针p进行改写。void main(void) int a=3,b=5; const int *pa=&b; /可以不赋初值 pa=&a;/指针变量可以重新赋值 cout*p

20、aendl; /输出3 *pa=10;/非法,指针指向的内容不能赋值 a=100;/变量可以重新赋值 cout*paendl; /输出1003)禁写指针又禁写间接引用将上面两种情况结合起来,声明语句为下面的格式const 数据类型 *const 指针变量名如:const int *const px=&x说明:px是一个指针常量,它指向一禁写的实体,并且指针本身也被禁写,诸如:px= *px= 此类的语句都是非法的。5.6函数的重载函数重载:函数重载:一组概念相同,处理对象(参数)一组概念相同,处理对象(参数)不同的过程,出于方便编程的目的,用同一不同的过程,出于方便编程的目的,用同一个

21、函数名字来命名的技术称为函数重载个函数名字来命名的技术称为函数重载参数默认:参数默认:一个函数,既可以严谨和地道的一个函数,既可以严谨和地道的调用,也可以省略参数,轻灵地调用,达到调用,也可以省略参数,轻灵地调用,达到此种方便编程目的的技术称为参数默认此种方便编程目的的技术称为参数默认重载与参数默认:重载与参数默认:它们都是通过参数的变化它们都是通过参数的变化来分辨处理任务的不同如果参数决定了不来分辨处理任务的不同如果参数决定了不同的处理过程,则应重载,否则参数默认更同的处理过程,则应重载,否则参数默认更简捷一些简捷一些函数的重载 在编程时,有时我们要实现的是同一类的功能,只是有些细节不同。例

22、如希望从3个数中找出其中的最大者,而每次求最大数时数据的类型不同,可能是3个整数、3个双精度数或3个长整数。程序设计者往往会分别设计出3个不同名的函数,其函数原型为:函数的重载int max1(int a,int b, int c); /求3个整数中的最大者double max2(double a,double b,double c); /求3个双精度数中最大者long max3(long a,long b,long c); /求3个长整数中的最大者C+允许用同一函数名定义多个函数,这些函数的参数个数和参数类型不同。这就是函数的重载。即对一个函数名重新赋予它新的含义,使一个函数名可以多用。例求

23、3个数中最大的数(分别考虑整数、双精度数、长整数的情况)。#include using namespace std;int main( )int max(int a,int b,int c); /函数声明double max(double a,double b,double c); long max(long a,long b,long c); int i1,i2,i3,i; cini1i2i3; /输入3个整数 i=max(i1,i2,i3); /求3个整数中的最大者 couti_max=iendl; couti_max=id1d2d3; /输入3个双精度数 d=max(d1,d2,d3);

24、 /求3个双精度数中的最大者 coutd_max=dg1g2g3; /输入3个长整数 g=max(g1,g2,g3); /求3个长整数中的最大者 coutg_max=ga) a=b; if(ca) a=c; return a;double max(double a,double b,double c) if(ba) a=b; if(ca) a=c; return a;long max(long a,long b,long c) if(ba) a=b; if(ca) a=c; return a;运行情况如下:185 -76 567 (输入3个整数)56.87 90.23 -3214.78 (输入

25、3个实数)67854 -912456 673456 (输入3个长整数)i_max=567 (输出3个整数的最大值)d_max=90.23 (输出3个双精度数的最大值)g_max=673456 (输出3个长整数的最大值)上例3个max函数的函数体是相同的,其实重载函数并不要求函数体相同。重载函数除了允许参数类型不同以外,还允许参数的个数不同。例 编写一个程序,用来求两个整数或3个整数中的最大数。如果输入两个整数,程序就输出这两个整数中的最大数,如果输入3个整数,程序就输出这3个整数中的最大数。#include using namespace std;int main( )int max(int

26、a,int b,int c); /函数声明 int max(int a,int b); /函数声明 int a=8,b=-12,c=27; coutmax(a,b,c)=max(a,b,c)endl; coutmax(a,b)=max(a,b)a) a=b; if(ca) a=c; return a;int max(int a,int b) if(ab) return a;else return b;运行情况如下:max(a,b,c)=27max(a,b)=8两次调用max函数的参数个数不同,系统就根据参数的个数找到与之匹配的函数并调用它。参数的个数和类型可以都不同。但不能只有函数的类型不同而

27、参数的个数和类型相同。int f(int); /函数返回值为整型long f(int); /函数返回值为长整型void f(int); /函数无返回值在函数调用时都是同一形式,如“f(10)”。编译系统无法判别应该调用哪一个函数。重载函数的参数个数、参数类型或参数顺序3者中必须至少有一种不同,函数返回值类型可以相同也可以不同。在使用重载函数时,同名函数的功能应当相同或相近,不要用同一函数名去实现完全不相干的功能,虽然程序也能运行,但可读性不好,使人莫名其妙。有默认参数的函数一般情况下,在函数调用时形参从实参那里取得值,因此实参的个数应与形参相同。有时多次调用同一函数时用同样的实参,C+提供简单

28、的处理办法,给形参一个默认值,这样形参就不必一定要从实参取值了。如有一函数声明float area(float r=6.5);指定r的默认值为6.5,如果在调用此函数时,确认r的值为6.5,则可以不必给出实参的值, area( ); /相当于area(6.5);area(7.5); /形参得到的值为7.5,而不是6.5如果有多个形参,可以使每个形参有一个默认值,也可以只对一部分形参指定默认值,另一部分形参不指定默认值。如有一个求圆柱体体积的函数,形参h代表圆柱体的高,r为圆柱体半径。函数原型如下:float volume(float h,float r=12.5); /只对形参r指定默认值12

29、.5函数调用可以采用以下形式: volume(45.6); /相当于volume(45.6,12.5)volume(34.2,10.4) /h的值为34.2,r的值为10.4默认形参值的说明次序默认形参值必须从右向左顺序声明,并且在默认形参值的右面不能有非默认形参值的参数。因为调用时实参取代形参是从左向右的顺序。例:int add(int x,int y=5,int z=6); /正确int add(int x=1,int y=5,int z); /错误int add(int x=1,int y,int z=6); /错误默认形参值与函数的调用位置调用出现在函数体实现之前时,默认形参值必须在函

30、数原形中给出;而当调用出现在函数体实现之后时,默认形参值需在函数实现时给出。int add(int x=5,int y=6);void main(void) add( ); /调用在实现前int add(int x,int y) return x+y; int add(int x=5,int y=6) return x+y; void main(void) add(); /调用在实现后默认形参值的作用域在相同的作用域内,默认形参值的说明应保持唯一,但如果在不同的作用域内,允许说明不同的默认形参。例:int add(int x=1,int y=2);void main(void) int add

31、(int x=3,int y=4); add(); /使用局部默认形参值(实现3+4)void fun(void) . add(); /使用全局默认形参值(实现1+2)例 求2个或3个正整数中的最大数,用带有默认参数的函数实现。#include using namespace std;int main( )int max(int a, int b, int c=0);int a,b,c; cinabc; coutmax(a,b,c)=max(a,b,c)endl; coutmax(a,b)=max(a,b)a) a=b; if(ca) a=c; return a;运行情况如下:14 -56 1

32、35max(a,b,c)=135max(a,b)=14在使用带有默认参数的函数时有两点要注意:(1) 如果函数的定义在函数调用之前,则应在函数定义中给出默认值。如果函数的定义在函数调用之后,则在函数调用之前需要有函数声明,此时必须在函数声明中给出默认值,在函数定义时可以不给出默认值。(2) 一个函数不能既作为重载函数,又作为有默认参数的函数。因为当调用函数时如果少写一个参数,系统无法判定是利用重载函数还是利用默认参数的函数,出现二义性,系统无法执行。内置函数调用函数时需要一定的时间和空间的开销。图表示函数调用的过程:图4.5C+提供一种提高效率的方法,即在编译时将所调用函数的代码直接嵌入到主调

33、函数中,而不是将流程转出去。这种嵌入到主调函数中的函数称为内置函数(inline function),又称内嵌函数。在有些书中把它译成内联函数。指定内置函数的方法很简单,只需在函数首行的左端加一个关键字 inline即可。例 函数指定为内置函数。#include using namespace std;inline int max(int,int, int); /声明函数,注意左端有inlineint main( )int i=10,j=20,k=30,m; m=max(i,j,k); coutmax=ma) a=b; if(ca) a=c; return a;由于在定义函数时指定它为内置函数

34、,因此编译系统在遇到函数调用“max(i,j,k)”时,就用max函数体的代码代替“max(i,j,k)”,同时将实参代替形参。这样,程序第6行 “m=max(i,j,k);”就被置换成if (ji) i=j;if(ki) i=k;m=i;注意: 可以在声明函数和定义函数时同时写inline,也可以只在其中一处声明inline,效果相同,都能按内置函数处理。使用内置函数可以节省运行时间,但却增加了目标程序的长度。内置函数中不能包括复杂的控制语句,如循环语句和switch语句。应当说明: 对函数作inline声明,只是程序设计者对编译系统提出的一个建议,也就是说它是建议性的,而不是指令性的。并非

35、一经指定为inline,编译系统就必须这样做。编译系统会根据具体情况决定是否这样做。归纳起来,只有那些规模较小而又被频繁调用的简单函数,才适合于声明为 inline函数。函数模板C+提供了函数模板(function template)。所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。看下面的例子就清楚了。#include using namespace std;template /模板声明,其中T为类型参数T max(T a,T b,T c) /定义一个通用函数,用T作虚拟的类型名if(ba) a=b; if(ca) a=c; return a;int main( )int i1=185,i2=-76,i3=567,i; double d1=56.87,d2=90.23,d3=-3214.78,d; long g1=67854,g2=-912456,g3=67

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论