面向对象的程序设计.pdf
《面向对象的程序设计.pdf》由会员分享,可在线阅读,更多相关《面向对象的程序设计.pdf(50页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、面向对象的程序设计华中科技大学计算机学院李瑞轩第2章 C+的变量、类型及函数第2章 C+的变量、类型及函数本章内容:本章内容:?2.1 声明及定义2.1 声明及定义?2.2 类型定义2.2 类型定义?2.3 引用类型2.3 引用类型?2.4 函数参数2.4 函数参数?2.5 函数内联2.5 函数内联2.1 声明及定义2.1 声明及定义?声明:声明:对名及其内涵的不完整描述。?定义:定义:对该名及其内涵的完整描述。?名可以声明多次,但只能定义一次。?类型声明:类型声明:前向引用声明只说明类名。?class Student;class Student;?变量声明:变量声明:类型、变量名。定义再加初
2、值。?函数声明:函数声明:函数原型只说明函数名,返回类型以及函数参数。定义再加函数体。2.1 声明及定义2.1 声明及定义?C语言:C语言:一般只允许以常量表达式初始化变量,局部非静态变量可以用任意表达式初始化。变量声明和定义必在语句前。?C+语言:C+语言:所有变量都可以用任意表达式初始化。变量声明和定义不必在语句前。兼容C,局部非静态变量如不初试化,则其值不确定。?常量表达式常量表达式:编译时可计算出常量值。?任意表达式任意表达式:常量、变量、函数调用等组成。只能在运行时计算出值。2.1 声明及定义2.1 声明及定义?常量表达式:常量表达式:3,3.14*3*3,size 2,sizeof
3、(int2),sizeof(3+printf(3,3.14*3*3,size 2,sizeof(int2),sizeof(3+printf(“ABCABC”)?任意表达式:任意表达式:?常量表达式常量表达式?A,3+A?printf(“ABCDEF”)?3+printf(“ABCDEF”)?注意:注意:int2是类型表达式,而非值表达式。值表达式包括常量表达式和任意表达式。值表达式又可分为左值或右值表达式。int2是类型表达式,而非值表达式。值表达式包括常量表达式和任意表达式。值表达式又可分为左值或右值表达式。2.1 声明及定义2.1 声明及定义?左值表达式:左值表达式:可以出现在等号左边的表
4、达式可以出现在等号左边的表达式。?非只读类型的变量:int x;非只读类型的变量:int x;x x=2;=2;?引用非只读类型的变量:int&y=x;引用非只读类型的变量:int&y=x;y y=3;=3;?指向非只读单元的内容访问:int*p=&x;指向非只读单元的内容访问:int*p=&x;*p*p=1;=1;?引用非只读类型的函数:int&f();引用非只读类型的函数:int&f();f()f()=3;=3;?前置+和前置+和运算,赋值运算:运算,赋值运算:(x=2)(x=2)=3;=3;(+x)(+x)=5;=5;?右值表达式:右值表达式:只能出现在等号右边的表达式。只能出现在等号右
5、边的表达式。?注意:注意:左值表达式是右值表达式,反之不成立。左值表达式是右值表达式,反之不成立。?某些变量或参数传递只能用左值表达式。如非只读类型的引用变量或参数。某些变量或参数传递只能用左值表达式。如非只读类型的引用变量或参数。2.1 声明及定义2.1 声明及定义?【例2.1】C+的声明、定义及初试化。?#include?extern inth=0;/C变量定义?extern inti;/C变量声明?inti;/C变量定义,缺省初始化i=0?intj=i+4;/C+变量定义,初始化j=i+4?static intp=j+5;/C+变量定义,初始化为p=j+52.1 声明及定义2.1 声明及
6、定义void main(void)static intn=j+5;/C+定义,初始化为n=j+5inti=20;/C定义,初始化为i=20intk;/C声明,k未初始化值不定for(int j=i+2;j9;j+)/C+定义,初始化为j=i+2 intm=5;/C定义,初始化为m=5k+=m;/警告,k未初始化就被引用;intq=23;/C+在语句中间定义变量scanf(%d,&j);/输入main外定义的变量jstruct int k,m;b=j+3,5;/C+定义,任意表达式初始化int a4=scanf(%d,&k),1;/C+定义,任意表达式初始化void main(void)stat
7、ic intn=j+5;/C+定义,初始化为n=j+5inti=20;/C定义,初始化为i=20intk;/C声明,k未初始化值不定for(int j=i+2;j9;j+)/C+定义,初始化为j=i+2 intm=5;/C定义,初始化为m=5k+=m;/警告,k未初始化就被引用;intq=23;/C+在语句中间定义变量scanf(%d,&j);/输入main外定义的变量jstruct int k,m;b=j+3,5;/C+定义,任意表达式初始化int a4=scanf(%d,&k),1;/C+定义,任意表达式初始化2.1 声明及定义2.1 声明及定义?允许初试化局部静态数组。C+的局部自动数组
8、通常在栈段分配空间,若初始化则还会在数据段分配空间。?程序X.CPP:程序X.CPP:?void main(void)/void main(void)/空间在栈段?intarray10;intarray10;?程序Y.CPP:程序Y.CPP:?void main(void)/void main(void)/空间在数据段?static int array10=1,2;static int array10=1,2;?程序Z.CPP:程序Z.CPP:?void main(void)/void main(void)/空间在栈段和数据段?intarray10=1;intarray10=1;2.1 声明及
9、定义2.1 声明及定义?简单类型全局变量:若初始化表达式是任意表达式,则初始值由编译生成的开工函数在运行时计算得到。?复杂类型全局变量:即全局对象,其初始化由开工函数调用其相应的构造函数完成。?注意:开工函数先于main执行,收工函数后于main执行。收工函数负责自动执行全局对象的析构函数。因此,程序被看作一个对象,有构造(生),活动(main),析构(死)。2.1 声明及定义2.1 声明及定义?#include#include?long sum(void)long sum(void)?intm,n,s=0;intm,n,s=0;?coutPlease input:;coutn,m=1;mn,
10、m=1;m=n;m+)s+=m;?coutnSum=s;coutnSum=*?注意:?(),的结合性自左至右?*,*&的结合性自左至右2.2 类型定义2.2 类型定义char (f)(int);?两个(),第一个为括号,第二个为函数;?优先级相同,根据结合性自左至右解释;?先解释左边的(f),(f)定义了标识符f;?再解释(int)说明f是一个有int参数的函数;?最后解释char,说明函数f的返回字符型;?上述定义等价于char f(int)。(f)没有实质性的作用。2.2 类型定义2.2 类型定义?char (*f)(int);?(*f)和(int)的优先级相同,两个()的结合性为自左向右
11、,先解释(*f)再解释(int)。?f是一个指针;?该指针指向一个函数;?该函数有一个int类型的参数;?该函数返回一个char类型的值。2.2 类型定义2.2 类型定义?char *f(int);?其中,*的优先级低于(int),先解释f(int)再解释*。?f是一个函数;?该函数有一个int类型的参数;?该函数返回一个指针类型的值;?该指针指向一个字符char。2.2 类型定义2.2 类型定义?括号可提高被解释对象的优先级,根据实际情况适当时可省略或不予解释。?C和C+规定,函数不能返回一个数组,数组的元素不能是函数。数组的元素可以是指针类型,指针可以指向函数:?int(*(*f)10)(
12、int,int);?其中,*自右向左解释,先*f,再*f。(*f)中()提高优先级,否则*f10将先解释f10。2.2 类型定义2.2 类型定义?根据运算符的优先级和结合性解释typedef定义的复杂类型:?typedef int(*F10)(int,int);?F *f;?由于F*f表示f指向F,然后再解释F,故将*f代换第一行的F时,应将*f括起来提高优先级,得到等价于如下形式的变量定义:?int(*(*f)10)(int,int);?强制类型转换中的类型表达式也必须通过优先级和结合性解释:(int(*(*)10)(int,int)x。2.2 类型定义2.2 类型定义?类型void是简单类
13、型,表示函数无参或无返回值,返回void的函数是过程,无须返回值:void f(int x)以及void main(void)。?类型void*表示所指对象类型不定,通过void*向对象赋值时必须进行强制类型转换。?任何地址常量、变量地址及指针变量的值都可以直接赋给void*类型:delete 2.2 类型定义2.2 类型定义【例2.5】void*类型的指针变量。?void main(void)?int p;float q,*m=&q;void *r=&p;?*r=345;/错误错误:往类型不定的单元赋值往类型不定的单元赋值?*(int*)r=345;/强制类型转换,强制类型转换,p=345?
14、*(int*)r=3.14;/强制类型转换,强制类型转换,p=3?r=m;/任意指针可直接赋给任意指针可直接赋给void*指针指针?*r=3.14;/错误错误:往类型不定的单元赋值往类型不定的单元赋值?*(float*)r=3;/强制类型转换,强制类型转换,q=3.00?*(float*)r=3.14;/强制类型转换,强制类型转换,q=3.14?2.2 类型定义2.2 类型定义?保留字const说明只读变量或不变变量,其值程序自身不能修改,故必须有一个初始值,在定义时必须初始化。?C+提倡用只读变量代替#define定义常量,可避免不当宏替换导致的语法错误。?其它程序可能改变只读变量的值。?指
15、针变量和指针所指的对象,两者或其中之一都可以定义为只读的。?指针为简单类型2.2 类型定义2.2 类型定义【例2.7】字符串常量指针和字符串变量指针。void main(void)const char*ptc;/非只读变量可不初始化非只读变量可不初始化?char*const cp=Const pointer;/只读变量,必须初始化只读变量,必须初始化?const char*const cptc=Cstptc;/为只读变量必须初始化为只读变量必须初始化?ptc=Pointer to constant;/非只读指针可修改非只读指针可修改?*ptc=P;/出错,出错,*ptc为为const char
16、?cp=Const ptr;/出错,出错,cp为为const类型类型?*cp=“Array of char”0;/*cp为为char类型,即类型,即*cp=A?cptc=Const to const ptr;/出错,出错,cptc为为const类型类型?*cptc=C;/出错,出错,*cptr为为const char2.2 类型定义2.2 类型定义指向只读对象的指针可用如下表达式赋值:?指向只读对象的指针变量;?指向普通对象的指针变量;?只读对象的地址;?普通对象的地址;?返回只读对象地址的函数调用;?返回普通对象地址的函数调用。2.2 类型定义2.2 类型定义指向普通对象的指针可用如下表达式
17、赋值:?指向普通对象的指针变量;?普通对象的地址;?返回普通对象地址的函数调用。指向普通对象的指针不能用如下表达式赋值:?指向只读对象的指针变量;?只读对象的地址;?返回只读对象地址的函数调用。2.2 类型定义2.2 类型定义【例2.8】只读对象地址不能赋给普通指针。?void main(void)void main(void)?inti,*p=&i,*h();inti,*p=&i,*h();?const intj=8,*q=&i,*f();const intj=8,*q=&i,*f();?q=&j;q=p;q=h();q=&j;q=p;q=h();?q=f();p=h();q=f();p=h
18、();?p=&j;/错:允许p=&j,则*p=5可修改const jp=&j;/错:允许p=&j,则*p=5可修改const j?p=q;/错误,由上类推p=q;/错误,由上类推?p=f();/错误,由上类推p=f();/错误,由上类推?2.2 类型定义2.2 类型定义?枚举类型:枚举类型:由enum定义,通常以int实现。?枚举元素:枚举元素:实现为只读整型变量或整型常量。可以指定元素值,整型值可以重复,第一个缺省值=0,下一个在上一个的基础上递增1。?enum WEEKDAY Sun,Mon,Tue,Wed,Thu,Fri,Sat;?上述枚举定义等价于:?typedef int WEEKD
19、AY;?const int Sun=0,Mon=1,Tue=2;?const int Wed=3,Thu=4,Fri=5,Sat=6;?可以定义如下枚举及变量:?WEEKDAY w1=Sun,w2(Mon);/等价于等价于w2=Mon?enum WK Su=-2,Mo,Tu,We,Th,Fr=1,Sa;/We=12.2 类型定义2.2 类型定义?挥发变量:挥发变量:由volatile声明和定义。从程序自身的角度来看,挥发变量的值可以自发改变(其实由其他进程或程序改变)。挥发变量可同时为只读的。挥发变量可同时为只读的。?const volatile int y=3;?volatile int x
20、;?x=3;?if(x=4)coutX changed by other routines;?【例2.9】编程唱“亚洲雄风”。进程int1c和main并发访问挥发变量number。函数main检测number的值,等到唱完一曲后结束。2.3 引用类型2.3 引用类型?引用类型:用运算符&声明和定义,某个实体的别名(不是新实体,逻辑上不分配内存)。变量、函数参数和返回值都可为引用类型。?只读引用变量:引用常量或只读变量,必须立即用右值表达式初始化。?普通引用变量:引用普通(左值)变量,必须立即用左值表达式初始化?挥发引用变量:引用挥发(左值)变量,必须立即用挥发变量的左值表达式初始化。注意C+的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 程序设计
限制150内