第一章C++概述.ppt_第1页
第一章C++概述.ppt_第2页
第一章C++概述.ppt_第3页
第一章C++概述.ppt_第4页
第一章C++概述.ppt_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

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

文档简介

1、面向对象程序设计,(C+程序设计) 杨佳 ,C+起源,1、在开发Unix系统的过程中,Unix之父之称的Ken Thompson创造了B语言。然而B语言并不足以克服编写早期操作系统的程序难以移植的问题 2、C语言问世于20世纪70年代,发明人是AT / 前缀 i表示int类型 float fX, fY, fZ; / 前缀 f表示float类型,命名规则,1、标识符应当直观且可以拼读,可望文知意, 不必进行“解 码” student 写成了x 2、标识符的长度应当符合“min-length / 变量x 与 X 容易混淆 void foo(int x); / 函数foo 与FOO容易混淆 void

2、 FOO(float x); 5、命名规则尽量与所采用的操作系统或开发工具的风格保持一致 例如:Windows应用程序的标识符通常采用“大小写”混排的方式,如AddChild。而Unix应用程序的标识符通常采用“小写加下划线”的方式,如add_child,系统定义类型的大小,被定义在包含文件LIMITS.H中,字符型 char char a; 短整型 short int short a; 整型 int int a; 长整型 long int long a; 浮点型 float float a; 双精度浮点型 double float double a; 长双精度浮点型 long double

3、long double a;,每个变量在内存中占用的字节数,1,2,4,4,4,8,8,c的表达式,表达式是有值的c语句。大多数可执行的c语句是 某种类型的表达式。 子表达式:表达式由更小的子表达式用运算符连 接起来构成。如下面的例子: int x; int y=2; x=5+2*y;,书写表达式的注意事项,1、在表达式中,连续出现两个运算符时,最好 用空格符分隔。 例如: a+ +b; 2、如果代码行中的运算符比较多,用括号确定 表达式的操作顺序,避免使用默认的优先级。 例如: if (a | b) )不要把程序中的复合表达式与“真正的数学表达式”混淆: 例如 if (a b c) / a

4、b c 是数学表达式而不是程序表达式 并不表示 if (ab) 则上面运算的结果是i等于3,j也等于3。 int i,j=2; i=j+; 而上面的运算结果是i等于2,而j等于3:,int x=3; Y=(x+)+(x+)+(x+); Y=(+x)+(+x)+(+x);,9,25,2.关系运算符,关系运算符内又分为两类:相等判断和不相等判断,它们分别是: (1)不相等判断: (大于)、=(大于等于)、(小于)、=(小于等于); (2)相等判断:=(等于)、!=(不等于)。,3.位运算符,位操作运算符进行二进制位操作: (1)逻辑位运算符 单目:(按位求反) 双目: void main( ) i

5、nt a,b=-1; a=abs(b); printf(%d,a); int abs(int v) return v0?-(v):v; ,c的指针,1、定义、使用及意义 指针变量就是值为一个地址的变量。 main( ) long i; long *PI; PI= ,假设变量i的地址为0 xf312,变量PI的地址为0 xf316:,执行到PI= double j,*PJ; 如果i的地址为12ff7c,j的地址为12ff70 则赋值语句PI=执行后: PI值12ff7c ,PJ值12ff70 。 下面执行语句PI=PI+2;PJ=PJ+2; 执行后 PI= ; PJ= ;,12ff84,12ff

6、80,不同类型的指针做加减运算的结果不同,指针运算验证,#include void main( ) int i,*PI; double j,*PJ; PI= ,3、指针与数组,指针的增减量与数组变址有密切的联系。 int array10; int *pi; int i; pi= 则*(pi+i)与arrayi操作的是同一个数组元素。,结构体,1、定义和访问 使用关键字struct定义自己的结构体类型。 例:定义struct coordinate float x; float y; ; 访问:struct coordinate one; one.x=5; one.y=1.5;,2、结构体指针,s

7、truct coordinate one; struct coordinate *pi= pi-y=1.5 注意:-专用于访问指针所指向的结构体变量的 成员。,第二部分:从c到c+之非面向对象的扩充,一、数据的I/O 1、I/O流 将数据从一个对象到另一个对象的流动抽象为“流”。 cin标准输入流 cout标准输出流 2、预定义的插入符和提取符 预定义的提取流运算符 cin表达式表达式,#include int sum(int a, int b); main() int i=0, j=0; printf(Enter i, j:); scanf(%d%d, ,#include int sum(i

8、nt a, int b); void main() int i=0, j=0; coutij; int c=sum(i, j); coutc=cendl; int sum(int a, int b) return a+b; ,例程比较结论,c+程序与c语言程序有如下区别: 1) c+程序开头包含了iostream.h文件,该 文件包含了c+语言输入/输出操作中的相关内容。 2)主函数main()和被调用函数add()在定义 时都加了类型说明符void和int这是不可省略的。 3)在主函数中出现了如下所示的输入和输出语句: coutij; coutc=cendl; 与c中输入输出不同, c+的输

9、入输出更简便,不必指定 输入输出类型。,二、默认参数的函数,在函数相应的形参后写上“=值”。 例如:int fun(int a, int b=8, int c=6); 注意:1)默认参数一般在函数声明时提供; 2)如果一个函数中有多个默认参数,则默 认参数应从右至左逐个定义。 如:void myfunc(int a=1,float b,long c=20);/错误 void myfunc(int a,float b=2.1,long c=20);/正确,函数默认参数的例子:,#include int sum(int i,int j=10); void main() int m=10,n=20;

10、 coutsum(m,n)endl; coutsum(m)endl; int sum(int i,int j) return (i+j); ,本例中定义了sum函数, 其中形参j具有默认值10。 由于本例中对函数sum进 行了声明,所以参数j的默 认值在函数声明中提供, 而在定义函数时不允许再 定义参数j的默认值。从程 序的运行结果看,当未给 第二个参数提供值时,该 参数按默认值进行运算。,(1) #include int func(int n=2); void main( ) coutfunc(1),; coutfunc(),; coutfunc(3)endl; int func(int n

11、) int s=0; for(int i=1;i=3;i+) s=n*(1+s); return s; ,(2) #include int m(8); int sum (int x, int y=7,int z=m); void main() int a(5),b(15),c(20); int s=sum(a,b); coutsendl; s=sum(a,b,c); coutsendl; int sum(int x, int y, int z) return x+y+z; ,例2:读程序并写出执行结果,三、内联函数(解决函数调用效率问题),内联函数系统将程序中出现的函数表达式用 该函数的函数体

12、进行替换。 定义方法: inline type 函数名(形参类型表) 注意: 1、内联函数体内不能有复杂的结构控制语句,如 循环语句和switch,否则内联函数将和普通函数 一样地被调用。 2、内联函数的定义必须出现在第一次调用前 3、内联函数的函数体不宜过大,通常以15行为宜 4、类结构中所有在类说明内部定义的函数都是内 联函数。,例:定义一个求两个整数中较小值的函数min(),要求定义成内联函数,然后在main函数中进行调用,#include int min(int x,int y) return (xy?x:y); void main() int m=10,n=20,t; t=min(m

13、,n); cout“最小值:”t; ,函数调用是有开销的: 参数传递、保护现场, 这些都需要CPU时间,宏定义,#define MAX(a,b) (a)(b)?(a):(b)int a=1,b=0;MAX(a+,b); /a被增值2次MAX(a+,b+10); /a被增值1次,#include inline int min(int x,int y) return (xy?x:y); void main() int m=10,n=20,t; t=min(m,n); cout“最小值:”t; ,其中t=min(m,n)其实代表min(m,n) return(mn?m:n); 一般调用函数时,是先转

14、去调用函数再转回到main函数接着执行下面的语句。 而内联函数省掉了先调用函数再转回main函数的这一步,即直接调用函数体,接着就进行下一步。,四、函数重载,与c不同,c+中允许定义多个函数名相同,但形 参表不同的函数。进行函数调用时,系统可以依据实 参的个数、类型、或顺序确定所调用的函数。 例如:void myfunc (float a, double b, long c=9); void myfunc (float a, int b); 则 myfunc(1.0, 2)调用的是 myfunc(1.0,2.0)调用的是 注意:重载函数间不能只是返回值不同。形参的个数、类型或顺序至少应该有一个

15、不同。,函数重载例:定义两个absolute函 数分别用于求整型数据和双精度浮 点数的绝对值。再定义两个min函 数,分别用于求两个整型数和三个 整型数中最小的一个。 #include int absolute(int x) return(x0?(-x):x); double absolute(double x) return(x0?(-x):x); int min(int x,int y) return (xy?x:y); int min(int x,int y,int z) int t; if(xy) t=x;,else t=y; if(tz) t=z; return (t); void

16、main() int im=10,in=20,ik=-10; double dd=-43.2; coutabsolute(ik)endl; coutabsolute(dd)endl; coutmin(im,in)endl; coutmin(im,in,ik)endl; ,10 43.2 10 -10,五、引用及声明方法,一、什么是引用 引用就是给某个已知变量或对象取一个别 名。 int m; int 二、为什么要用引用:指针的不安全性,引用的目的就是为了减少指针的使用。,引用和指针,1.指针是变量,引用不是变量 指针是一种用来存放某个变量或对象的地址 值的特殊变量,指针的类型是它所指向的变量或

17、 对象的类型。 引用不是变量,它本身没有值和地址值,引 用的地址值是它被绑定的变量或者对象的地址 值,它的值也是被绑定变量的值。,引用和指针,2.指针能被引用,而引用不可以被引用 int *p; int *,/rp是一个指针p的引用,引用和指针,3.指针可以作数组元素,引用不可以作数组元素 如: int *p3; p是一个指针数组,该数组有3个元素,每个元素都是int型的指针。 int a3; int /错误,引用不能作数组元素。,引用和指针,4.可以有空指针,不能有空引用。 int *p=NULL; /合法 int /非法,五、引用及声明方法,三、引用主要有三个用途: 1)独立引用; 2)作

18、为参数传递; 3)作为返回类型。,1. 独立引用,独立引用表示为:类型 ,引用的定义及使用方法例 #include void main() int a,b=10; int ,cout ,/定义引用ra,初始化成变量a,所以ra是变量a的引用(别名),/等价于coutaendl;,/等价于cout,/等价于coutaendl;,/等价于cout,/等价于a=b,/输出变量a所占存储单元的地址(指针),2. 作为参数传递,在c语言当中函数的调用有两种方式:传值 调用、传址调用。 在函数调用中,称传递实参数据值的为传 值调用;称传递实参地址值的为传址调用。在 c+中支持这两种调用方式,同时增加了一种

19、类 似c中传址调用的引用调用方法,但比传址调用 更加清晰。,#include void swap(int *a, int *b); main() int i=10, j=20; swap( ,#include void swap(int ,引用特点总结:,1) / C+ 语言的const常量 const float PI = 3.14159; / C+ 语言的const常量,六、常量,注意: const与#define的比较:在使用宏(#define)定义符号常量时不具备数据类型,因此在编译中无法知道因类型而引起的错误。 规则二:在C+ 程序中通常使用const常量而不使用宏常量,即const

20、常量完全取代宏常量。 规则三:如果某一常量与其它常量密切相关,应在定义中包含这种关系,而不应给出一些孤立的值。 例如: const float RADIUS = 100; const float DIAMETER = RADIUS * 2;,六、const说明,C+中可以用关键字const定义符号常量。 例如:const float pi=3.1415926; void main() const int i; i=30; ,错误:常量不能被赋值,错误:常量必须在定义的同时进行初始化,const与指针配合使用,衍生出3种不同的用法:,1、指向常量的指针:const 类型 *指针变量名 例如,co

21、nst int *p; int a; p= 这时不能通过指针p改变a的值,但p可以指向另一个变量。,1、指向常量的指针作用,如果输入参数采用“指针传递”,那么加const 修饰可 以防止意外地改动该指针,起到保护作用。 例如StringCopy 函数: void StringCopy(char *strDestination, const char *strSource); 其中strSource 是输入参数,strDestination 是输出参数。 给strSource 加上const修饰后,如果函数体内的语句试图 改动strSource 的内容,编译器将指出错误。,#include #i

22、nclude void StringCopy(char *StrDestination, const char *StrSource); void main() char StrIn20=你好!; char StrOut20=; StringCopy(StrOut, StrIn); coutStrIn; coutStrOutendl; void StringCopy(char *StrDestination, const char *StrSource) strcpy(StrSource,吃饭没?); strcpy(StrDestination, StrSource); ,错误:const c

23、har * to char *,注意事项,1)指向常量的指针(const 类型 *指针变量名), 不是表示指针本身为常量。 2)指向常量的指针不一定指向真正的常量,它 可以指向变量,只是该指针一旦指向了某一 对象,就不能通过该指针来修改它所指向的 对象的值。 3)指向常量的指针可以指向其他对象,可以不 初始化。,2、指针常量:,类型 *const 指针变量名=初始指针值 例如,char *const p=“abcde”; 这时指针p不能指向其他的量,但是它指向的字符串可以被 修改。,#include #include void StringCopy(char *StrDestination, char * const StrSource); void main() char StrIn20=你好!; char StrOut20=; StringCopy(StrOut, StrIn); coutStrIn; coutStrOutendl; void StringCopy(char *StrDestination, char * const StrSource) strcpy(StrSource,吃饭没?); StrSource=吃了!; strcpy(StrDestination, StrSource); ,不能让指针常量再指向另

温馨提示

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

评论

0/150

提交评论