版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第第2章章 从从C到到C+第第2章章 C+在非面向对象方面对在非面向对象方面对C的扩充的扩充2第第2章章 从从C到到C+C语言是C+的子集,C+包含了C语言的全部内容。一个C语言编写的程序不经修改,就可以利用C+编译器编译,形成可执行代码。 C+对C语言注入了面向对象的新概念,同时也增加了一些非面向对象的新特性,这些新的特性使得C+程序更简洁或更安全。3第第2章章 从从C到到C+2.1 C+2.1 C+中的注释语句中的注释语句 在程序中,注释语句的作用主要有两个:(1)读程序的方便,程序员通常会增加一些说明性的文字;(2)程序过程中,如果对于某(几)条语句,暂时不能决定是否需要删除时可以暂时
2、将其注释。 4第第2章章 从从C到到C+C+中提供了两种类型的语句注释方法:(1)块注释:即使用/*开始,*/结束的形式,这种形式不允许出现注释嵌套,主要用于多行注释,例如程序开头的功能说明,版权说明等信息;(2)行注释:即以“/”开始,直到行结尾结束的注释。这种方式多用于注释单行,或在一行的后面添加说明语句。这种注释方式允许嵌套使用。5第第2章章 从从C到到C+下面用一个例子说明C+中两种注释语句的用法:/*这是一个说明C+中注释语句的例子 当前使用的块注释方式*/class MyComplex /这是用C+定义的一个复数类 /这是一条行注释,我在嵌套/private:double x;do
3、uble y; void display();上面的例子中前两句采用了块注释;第三行在行末使用行注释说明本条语句的作用,并且使用了注释嵌套;第四行用行注释注释掉一行。 6第第2章章 从从C到到C+2.2 C+中的输入输出 在C+中,除了可以利用C语言中的标准输入输出外,也可以通过输入输出流类库进行。所谓“流”是指来自设备或输出到设备的一系列字节,这些字节按照进入“流”的顺序排列。iostream类是最常用的流库,它提供了用于从标准输入设备(默认为键盘)输入的默认对象cin和输出到标准输出设备(默认为显示器)的对象cout。利用cin和cout就可以完成数据的基本输入和输出。 7第第2章章 从从
4、C到到C+ 运算符“”在C+中仍保持C中的右移功能,但用于输入时扩充了其功能,表示将从标准输入流(即键盘)读取的数值传送给右方指定的变量。例如: cinx;此时,用户从键盘输入的数值会自动转换为变量用户从键盘输入的数值会自动转换为变量x x的的类型,并存入变量类型,并存入变量x x内内。 运算符“”允许用户连续输入一连串数据,例如: cinabc;它按照书写的顺序从键盘上提取所要求的数据,并存入对应的变量中。两个数据间用空白符(空格、两个数据间用空白符(空格、回车或一个回车或一个TabTab键)分隔。键)分隔。8第第2章章 从从C到到C+ 运算符“”在C+中仍然保持C中的“左移”操作,但用于输
5、出时候扩充了其功能,表示将右方的变量的值写到标准输出流cout中,即显示到屏幕上。例如执行下面语句后: cout y;变量y的值将显示到屏幕上。 运算符运算符“”允许用户连续输出一连串的数允许用户连续输出一连串的数据,也可以输出表达式的值,例如:据,也可以输出表达式的值,例如: coutcout a + bc; a + bc;它按照书写的顺序输出到屏幕上。9第第2章章 从从C到到C+说明:说明:(1) 如果在程序中使用cin和cout,必须将头文件包含到本文件中:#include (2)使用“cin”可以连续输入多个数据,但是由于用户常常忘记空白符号(空格、回车或一个Tab键)来分隔两个数值,
6、容易造成输入混乱,因此使用时要加以注意。10第第2章章 从从C到到C+ cout的一般形式为: cout表达式1变量1变量n; 例如: cinab; cout“a=”a“,b=”b; 当输入1 2时,1被送给了a,2被送给了b。得到的输出形式为: a=1,b=211第第2章章 从从C到到C+ (3) cin或cout语句可以写在同一行上,也可以分开写在多行上。如果写在多行上,除最后一行外,行尾不能加分号。 cout“x = ”x “y = ”y; (4) 利用cin和cout,在输入输出时不必考虑变量或表达式的类型。对于cout,系统会自动判断正确的类型并进行输出;对于cin,系统也能够会根据
7、变量的类型从输入流中提取相应长度的字节。12第第2章章 从从C到到C+ (5) 如果需要将数据换行输出,可以插入一个换行符endl,如: cout”Hello”endl;/cout对象被插入一个endl cout”world!”; 输出结果为: Hello World!13第第2章章 从从C到到C+2.3 变量和类型.变量定义方法C+中几乎可以在任何位置、任何时刻根据需要定义局部变量。 【例21】灵活变量定义的例子。 #include int sum=0; /在函数体外定义变量sumvoid main() int a5=0,1,2,3,4; for(int i=0;i5;i+) /在for语句
8、中定义变量i sum+=ai; double avg=sum/5; /在语句体中定义变量avgcoutsum=sum,average=avgendl;cout”i=”iendl;14第第2章章 从从C到到C+ 2. 枚举,结构体和共用体 C+中,枚举名,结构名和共用体名的定义与C语言中基本相同,但在使用时更方便。当实例化变量时,不必在一个枚举名、结构名或共用体名之前再加上类型名。 15第第2章章 从从C到到C+可以采用如下的形式进行定义变量:COLOR c;/定义一个COLOR型变量cTIME t;/定义一个TIME型变量tSALARY s;/定义一个SALARY型变量s不必象C语言那样写成如
9、下形式:enum COLOR c;/定义一个COLOR型变量cstruct TIME t;/定义一个TIME型变量tunion SALARY s;/定义一个SALARY型变量s16第第2章章 从从C到到C+3. const修饰符 在编写程序时经常需要定义常量,C+中保留了C语言中采用#define进行定义的方式,如下列语句就定义了一个符号常量MAX_SIZE,用于代表100: #define MAX_SIZE 100 C+中引入一种更灵活、更安全的方式来定义常量,即使即使用用constconst关键字定义常量(也称为只读变量),如:关键字定义常量(也称为只读变量),如: const int m
10、axSize100;maxSize为一个int型的常变量,它的值为100,并且在整个运行过程中不允许被改变。17第第2章章 从从C到到C+const除了可以用于定义普通的常变量之外,也可以用于定义常指针。它们的组合情况可以归纳为三种:指向常量的指针、常指针和指向常量的常指针。1)指向常量的指针:一个指向常量的指针变量。例如:const char *name=“chen”;2)常指针:指指针本身,而不是它所指向的对象为常量。例如:char * const p =hello; 3)指向常量的常指针:指针本身不能改变,它所指向的值也不能改变。例如: const char *const name=“c
11、hen”;18第第2章章 从从C到到C+【例22】const和指针结合的例子void main() char s=good; char *p1= hello; / 非const指针 const char *p2= s; / const数据 *p2=G;/错误 p2=p1; /正确 char* const p3= s; / const指针,非const数据 *p3=G;/ 正确 p3=p1;/ 错误 const char* const p4 = s; / const指针,const数据 *p4=G;/ 错误 p4=p1;/ 错误19第第2章章 从从C到到C+说明:(1) 如果用const定义的是
12、一个整型的常量,关键字int可以省略。下面两行定义是等价的: const int LIMIT=100; const LIMIT=100;(2) 常量一旦被建立,在程序的任何地方不能再修改。(3) 与define定义的常量有所不同,const定义的常量可以有自己的数据类型,这样C+的编译程序可以进行更严格的类型检查,具有良好的编译时的检测性。20第第2章章 从从C到到C+【例23】说明使用define的不安全性。#include main() int a=1; #define T1 a+a coutT1 is T1endl; #define T2 T1-T1 coutT2 is T2endl;
13、return 0;21第第2章章 从从C到到C+【例24】使用const取代define。#include main() int a=1; const T1= a+a; coutT1 is T1endl; const T2= T1-T1; coutT2 is T2endl; return 0;22第第2章章 从从C到到C+const的另外一个用途是:如果某个函数参数不允许被改变时,如果某个函数参数不允许被改变时,可用可用constconst将其声明为常变量。将其声明为常变量。例如:【例25】使用const修饰函数参数。 #include void fun(const int m) m=10;
14、/错误,函数不能修改m,只能使用m coutm+100; /正确,使用m void main() int n=10; fun(n); coutn; /输出 1023第第2章章 从从C到到C+4.强制类型转换 在C中如果要把一个整数(int)转换为浮点数(float),要求使用如下的格式: int i=10; float x=(float)i;C+支持这样的格式。还提供了一种更为方便的函数调用方法,即将类型名作为函数名使用,使得类型转换的执行看起来好像调用了一个函数。上面的语句可以改写成: int i=10; float x=float (i); 24第第2章章 从从C到到C+5.作用域运算符“
15、:”通常情况下,如果有两个同名变量,一个是全局的,另外一个是局部的,那么局部变量在其作用域内具有更高的优先权。下面的例子说明了这一点。【例26】局部变量具有更高的优先权。#include int avar=10;main()int avar;avar=25;coutavar is avarendl;return 0;程序的执行结果如下:程序的执行结果如下:avar is 2525第第2章章 从从C到到C+【例27】使用作用域运算符“:”。#include int avar;main()int avar;avar=25;:avar=10;coutlocal avar = avarendl;cou
16、tglobal avar = :avarendl;return 0;程序的执行结果如下:程序的执行结果如下:local avar = 25Global avar=1026第第2章章 从从C到到C+2.4 C+2.4 C+中的函数中的函数 C+保留了C语言中与函数有关的所有约定,例如函数定义格式,参数传递方式等。同时,C+对于函数也进行了一定的扩充,例如允许为函数的形参设定默认值,允许函数重载,引入了inline函数等。 27第第2章章 从从C到到C+1、函数的原型 C语言建议编程者为程序中的每一个函数建立原型,而C+要求必须为每一个函数建立原型,以说明函数的名称、参数类型与个数,以及函数返回值
17、的类型。 函数原型的语法形式一般为:函数原型是一条语句,它必须以分号结束。它由函数的返回类型、函数名和参数表构成。参数表包含所有的参数及它们的类型,参数之间用逗号分开。 返回类型 函数名(参数表);28第第2章章 从从C到到C+【例28】函数原型的使用。#include void write(char *s);/函数的原型说明main() write(hello, world); return 0;void write(char *s) coutsendl; 29第第2章章 从从C到到C+ 函数原型的参数表中可不包含参数的名字,只包含类函数原型的参数表中可不包含参数的名字,只包含类型。例如下面
18、的函数原型是完全合法的:型。例如下面的函数原型是完全合法的: int area(int, intint area(int, int);); 函数定义由函数说明部分和函数体构成。函数说明部分函数定义由函数说明部分和函数体构成。函数说明部分与函数原型基本一样,但函数说明部分中的参数必须给出名与函数原型基本一样,但函数说明部分中的参数必须给出名字,而且不包含结尾的分号字,而且不包含结尾的分号;例如:;例如: int area(int length,intint area(int length,int width) width) return (length return (length* *widt
19、h);width); 主函数主函数main( )main( )不必进行原型说明,因为它被看作一个不必进行原型说明,因为它被看作一个自动说明原型的函数。主函数是第一个被执行的函数,不存自动说明原型的函数。主函数是第一个被执行的函数,不存在被别的函数调用的问题。在被别的函数调用的问题。30第第2章章 从从C到到C+ 函数原型说明中没有指出返回类型的函数(包括main( ) ),C+默认该函数的返回类型是int。 如果一个函数没有返回值,则必须在函数原型前注明返回值类型为void。 如果函数原型中未注明参数,C+假定该函数的参数表为空(void),即不带任何参数。31第第2章章 从从C到到C+2.
20、带有默认参数值的函数 函数调用时,主调函数和被调函数存在着数据传递关系,即主调函数需要将实参的值传递给形参。 如果某个函数在多次被调用的情况下都需要使用某个参数值,此时就可以为该函数设置默认值。例如函数max的函数说明为: int max(int a=2,int b=3)这里为max的形参a和b分别指定了默认值2和3。 当进行函数调用的时候,编译器按照从左向右的顺序将实参与形参结合,若未指定足够的实参,则编译器按顺序用函数原型中的缺省值来补足所缺少的实参。32第第2章章 从从C到到C+例如,在主调函数中可以使用如下形式调用max函数: z=max();/省略两个实参值, /相当于语句 z=ma
21、x(2,3); z=max(5);/省略第2个实参值, /相当于语句z=max(5,3); z=max(-1,4);/忽略函数默认参数值33第第2章章 从从C到到C+使用函数参数默认值时需要注意如下几点:使用函数参数默认值时需要注意如下几点: (1) 当为函数指定默认参数值时,必须按照由右到左的顺序进行指定,决不允许存在一个参数指定默认值,而它右边的参数没有默认值的情况。 例如函数声明: int f1(int a,int b=2,int c=3); /正确 int f2(int a=1,int b=2,int c); /错误,c没有默认值,/所以不能为a和b指定默认值 int f3(int a
22、=1,int b,int c=3); /错误,b没有默认值, /所以不能为a指定默认值34第第2章章 从从C到到C+(2) 如果设置了默认参数的函数定义在主调函数之前,可以省略函数声明语句;否则在调用前必须有函数声明语句,且声明语句中必须指明参数默认值。35第第2章章 从从C到到C+以下是几个采用函数默认值的例子以下是几个采用函数默认值的例子 :(1)void print(int a=2);void main() print();void print(int a) coutaendl;(2)void print(int a);void main() print();void print(int
23、 a=2) coutaendl;(3)void print(int a=2 );void main() print();void print(int a=2) coutab?a:b;void main()int x=2,y=3,z;z=max(x,y);coutzy?x:y;39第第2章章 从从C到到C+说明:(1)内联函数在被调用之前必须进行完整的定义,否则编译器将无法知道应该插入什么代码。内联函数通常写在主函数前。(2)C+的内联函数具有与C中的宏定义#define相同的作用和相似的原理,但消除了#define的不安全因素。请看下面两个例子:40第第2章章 从从C到到C+【例29】使用带参
24、数宏定义完成乘2的功能。#include #define doub(x) x*2int main() for(int i=1;i=3;i+) couti doubled is doub(i)endl; cout1+2 doubled is doub(1+2)endl; return 0;程序的执行结果如下:程序的执行结果如下:1 doubled is 22 doubled is 43 doubled is 61+2 doubled is 541第第2章章 从从C到到C+【例210】使用内联函数完成乘2的功能。#include inline int doub(int x) return x*2;
25、 int main()for(int i=1;i=3;i+)couti doubled is doub(i)endl;cout1+2 doubled is doub(1+2)endl;return 0;程序的执行结果如下:程序的执行结果如下:1 doubled is 22 doubled is 43 doubled is 61+2 doubled is 642第第2章章 从从C到到C+注意: 并非在函数定义时加上inline,编译系统就一定会将其看作inline函数。关键字inline只是给编译系统提供一个建议,希望编译系统在编译时能将函数代码替换到函数调用位置,但是如果函数中存在循环语句,s
26、witch语句,或存在数组定义时,编译系统将不知道应该如何替换,只能将其按照普通函数处理。 因此,只有那些不包含循环和switch选择结构,不包含数组定义,并且代码行数较少(建议不超过5行)的函数才适合设计成inline函数。 43第第2章章 从从C到到C+4.函数重载 在C+中,一个函数名可以对应多个不同的函数。当两个或两个以上的函数共用一个函数名时,称为函数重载 。被重载的函数称为重载 函数。 函数重载有两种基本的方式:一种是函数参数个数相同,但类型有所不同的重载,另外一种是函数参数个数也不同的重载。 44第第2章章 从从C到到C+【例211】参数类型不同的函数重载的例子#include
27、int max(int a,int b) return ab?a:b;double max(double a,double b)return ab?a:b;void main()coutmax(10,5)endl;/调用第1个max函数coutmax(10.5,5.0)endl;/调用第2个max函数 45第第2章章 从从C到到C+【例2-12】形参个数不同的函数重载的例子。#include int max(int a,int b)return ab?a:b;int max(int a,int b,int c)int d=max(a,b);return dc?d:c;void main()co
28、utmax(10,5)endl;/调用第1个max函数coutmax(10,5,2)endl;/调用第2个max函数46第第2章章 从从C到到C+注意:(1) 面向对象中不支持函数参数个数和参数类型都相同,但函数返回类型不相同的重载方式。(重载函数应该在参数个数或参数类型上有所不同,否则编译器没有办法确定调用哪一个重载版本。)(2) 通常重载的函数应该具有相同或相似的功能,不应出现两个同名函数提供完全不同或差异太大的功能,这样在编程过程中很容易产生混淆,不利于程序的编写和阅读。只有在某个函数需要处理不同类型的参数或者不同个数的参数时,才需要进行重载,其他时候没有重载的必要。 47第第2章章 从
29、从C到到C+2.5动态内存分配 对于一个程序单元而言,可以有两种获得内存的方式:静态内存分配和动态内存分配。前者是在编译阶段就分配好存储空间,并且这些空间的大小在程序运行期间是不可更改的,例如全局变量,数组等的分配;后者则是由程序员在程序中通过使用内存分配函数或使用内存分配运算符从系统堆(一块自由存储区)中获取存储空间。静态获得的内存,系统在变量等生命期结束时自动回收,动态获得的空间需要程序员通过语句或运算显式地释放。48第第2章章 从从C到到C+1.new运算符 C语言中使用函数malloc( )和free( )动态分配内存和释放动态分配的内存。C+中使用运算符new和delete能更好地、
30、更简单地进行内存的分配和释放。 new运算符用于动态分配一块连续的内存空间,其基本语法形式有: new /*从一块自由存储区中分配一块sizeof(type)字节大小的内存。*/其中,其中,type可以是可以是C+支持的所有数据类型名,可支持的所有数据类型名,可以是基本的数据类型,也可以是自定义数据类型。以是基本的数据类型,也可以是自定义数据类型。49第第2章章 从从C到到C+ new运算符返回一个指向所分配的存储空间的第1个单元的指针,如果当前存储器没有足够的内存空间可分配,则返回NULL。例如:int * p1=new int; /分配一个用于存储1个整型数据的连续区域,/并将首地址返回给
31、p1使用new可以为数组动态分配空间,这时候需要在类型名后加上数组的大小。 int * p1=new int1;int* p2=new int10; /分配一个整型的一维数组/ (大小为10个整型数据),并将首地址返回给p2int * p3=new int45;/分配一个整型数组能存储 /一个45的二维数组,并将首地址返回给p3使用使用newnew动态分配内存动态分配内存的时候,如果没有足够的时候,如果没有足够的内存满足分配要求,的内存满足分配要求,newnew将返回空指针将返回空指针(NULL).(NULL).因此,通常要对内存的因此,通常要对内存的动态分配是否成功进行检查动态分配是否成功进
32、行检查50第第2章章 从从C到到C+2.delete运算符 对于动态分配的内存在使用完后,一定要及时归还给系统。如果应用程序对有限的内存只取不还,系统很快就会因为内存枯竭而崩溃。利用new动态分配的存储空间通常可以利用delete运算进行释放。delete运算符的基本语法形式有: delete 指针变量 /指针变量中保存的是 / new分配的内存首地址delete 指针变量 /释放动态分配的数组存储区51第第2章章 从从C到到C+使用delete释放内存空间时,应注意以下几点: (1)利用new运算符分配的内存空间,只许使用一次delete,如果对同一块空间进行多次释放,将会导致严重错误。(2
33、)delete只能用来释放动态分配的内存空间。52第第2章章 从从C到到C+【例2-13】使用new和delete的例子。#include main()int *p;p=new int;if(!p) /若动态分配内存失败时, coutallocation failuren; return 1;*p=20;cout*p;delete p;return 0;53第第2章章 从从C到到C+2.6 引用1. 引用的定义与特点 所谓引用,就是给变量取个别名,定义引用的基本格式为:(1)类型 &引用名变量名;(2)类型 &引用名(变量名);引用必须初始化。例如:int n;/定义整型变量n
34、int &refn=n;/为n定义一个别名refn引用与被引用的变量具有相同的地址,因而对引用的存取就是对变量的存取。当实体或引用其中一个发生变化,另一个也随之改变。 54第第2章章 从从C到到C+【例214】引用的例子。#include void main() int n=2; int &refn=n;/为n定义一个别名refn cout&n=&n,&refn=&refnendl;/输出n和refn的地址 coutn=n,refn=refnendl; n+=5; /修改变量的值 coutn=n,refn=refnendl; refn*=2; /
35、修改引用的值 coutn=n,refn=refnendl; 输出结果为:输出结果为:&n=0013FF60,&refn=0013FF60n=2,refn=2n=7,refn=7n=14,refn=1455第第2章章 从从C到到C+2、 引用作函数的参数 C语言中,实参和形参之间的数据传递采用的是单向的值传递方式:要求实参和形参的类型和个数要一致。实参将 “单向性”的“值传递”给形参。在被调函数中对形参的值的修改不会影响到实参。当函数未被调用时,形参不占内存。当函数被调用时,为形参分配内存,并将实参的值传递给形参;函数调用结束时,释放形参所占存储空间。【例214】值传递的例子。5
36、6第第2章章 从从C到到C+主调函数主调函数被调函数被调函数includevoid swap(int,int);void main ()int a,b;a=5;b=9;swap(a,b);cout“a=“a“b=“b;swap (int x,int y) int t; t=x; x=y; y=t;55ab实实 参参形形 参参99xyabxy9557第第2章章 从从C到到C+通常,可以利用指针可以解决这一问题。【例215】#include void swap(int *a,int *b) int t=*a; a=a=b; *b=t;void main() int a=2,b=3; couta=a
37、,b=bendl; swap(a,b); couta=a,b=bendl;输出结果:输出结果:a=2,b=3a=3,b=258第第2章章 从从C到到C+主调函数主调函数被调函数被调函数&a实实 参参形形 参参&b*x*yabvoid swap(int *x,int *y) int t; t=*x;*x=*y;*y=t; #includevoid swap(int*,int *);void main()int a,b;a=5;b=9;swap( &a, &b );cout“a=”a“b=“b;5ab9xy&b&a9559第第2章章 从从C到到C+【例2-16】例2-14的改写。#include void swap(int
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年大学(能源与动力工程)传热学考核题
- 2025年大学大一(机械设计)机械零件认知阶段测试卷
- 2025年中职(宠物养护与经营)宠物饲养管理试题及答案
- 2025年中职农产品加工(农产品加工技术)试题及答案
- 2025年大学第四学年(国学经典讲论)经典应用综合测试试题及答案
- 2025年高职物流电子数据交换技术(物流电子数据交换技术基础)试题及答案
- 2026年系统思维(系统训练)考题及答案
- 2025年高职(测绘地理信息技术)GIS数据处理试题及答案
- 2025年高职工业机器人技术(工业机器人专题)试题及答案
- 2026年广西教育学院高职单招职业适应性考试备考题库带答案解析
- 2025至2030中国日本清酒行业市场发展现状及发展前景与投资报告
- T/CECS 10169-2021埋地用聚乙烯(PE)高筋缠绕增强结构壁管材
- openEuler系统管理与服务器配置 课件 第9章DNS服务器
- 供销集团考试试题及答案
- 《并购后的整合与管理》课件
- 高一期中历史试卷及答案
- 《纪检工作规范化法治化正规化建设年行动工作方案》培训
- 江苏省苏州市2020年中考化学真题试卷(含答案)
- 《环境保护税纳税申报表(A类)》
- 《普拉提》课程教学大纲
- 江苏2024年高中学业水平合格性考试生物试卷真题(含答案详解)
评论
0/150
提交评论