第2章C++基础_第1页
第2章C++基础_第2页
第2章C++基础_第3页
第2章C++基础_第4页
第2章C++基础_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

1、 第第2章章 C+基础基础 2.1.1 C+的产生的产生 C+是美国贝尔实验室于是美国贝尔实验室于1980年开发出来年开发出来的一种过程性与面向对象性结合的程序设计的一种过程性与面向对象性结合的程序设计语言。最初他把这种新的语言叫做语言。最初他把这种新的语言叫做“含类的含类的C”,到到1983年才取名为年才取名为C+。 2.1.2 C+的特点的特点 (1) C+保持与保持与C兼容。兼容。 (2) 用用C+编写的程序可读性更好编写的程序可读性更好,代码结构更为合理代码结构更为合理,可直接地在程序中映射问题空间的结构。可直接地在程序中映射问题空间的结构。 (3) 生成代码的质量高生成代码的质量高,

2、运行效率仅比汇编语言代码运行效率仅比汇编语言代码段慢段慢10%到到20%。 (4) 从开发时间、费用到形成的软件的可重用性、可从开发时间、费用到形成的软件的可重用性、可扩充性、可维护性和可靠性等方面有了很大的提高扩充性、可维护性和可靠性等方面有了很大的提高,使得大中型的程序开发项目变得容易的多。使得大中型的程序开发项目变得容易的多。 (5) 支持面向对象的机制支持面向对象的机制,可方便地构造出模拟现实可方便地构造出模拟现实问题的实体和操作。问题的实体和操作。 2.2.1 一个简单的一个简单的C+示例程序示例程序例例2.1 两数相加两数相加/*/最简单的方式最简单的方式#include void

3、 main()int a,b,sum;cinab;sum=a+b;couta与与b的和为的和为sumendl;*/例例2.1 两数相加两数相加/标准形式标准形式#include int add(int ,int);/函数原型说明函数原型说明void main()/主函数主函数int x,y,sum;/定义定义3个整型变量个整型变量coutenter two numbers:xy;/从键盘输入变量的值从键盘输入变量的值sum=add(x,y);/调用调用add函数函数coutthe sum is:sumendl;/输出两个数的和输出两个数的和sum的值的值int add(int a,int b)

4、/定义定义add函数函数,函数值为整型函数值为整型int c;/定义一个整型变量定义一个整型变量c=a+b;/计算两个数的和计算两个数的和return c;/将将c的值返回的值返回,通过通过add带回调用处带回调用处 类的声明部分类的声明部分 面向对象程序面向对象程序 类的使用部分类的使用部分例例2.2 2.2 典型的典型的C+C+程序结构程序结构#include#include/ / 类的声明部分类的声明部分class A class A int x,y,z; / int x,y,z; /类类A A的数据成员声明的数据成员声明 fun() / fun() /类类A A的成员函数声明的成员函数

5、声明 ;/ / 类的使用部分类的使用部分 int main() int main() A a; / A a; / 创建一个类创建一个类A A的对象的对象a a a.fun(); / a.fun(); / 给对象给对象a a发消息发消息, ,调用成员函数调用成员函数fun()fun() return 0; return 0; C+语言是一种高级程序设计语言,它的开发过程与其他高级语言程序开发过程类似,一般要经过四个步骤:u编辑u编译u链接u执行l编辑编辑是指把按照C+语法规则编写的程序代码通过编辑器(Borland C+,Visual ,Turbo C0)输入计算机,并存盘。在存盘时,C+源文件

6、的扩展名为.CPP。 在在Windos下下,常用常用Visual C+开发环境开发环境,来编来编辑、编译和运行辑、编译和运行C+程序。程序。 l编译编译将编辑好的C+源程序通过编译器转换为目标文件(OBJ文件)。即生成该源文件的目标代码。 l链接链接 将用户程序生成的多个目标代码文件(.obj)和系统提供的库文件(.lib)中的某些代码连接在一起,生成一个可执行文件(.exe)。l执行执行把生成的可执行文件运行,在屏幕上显示运行结果。用户可以根据运行结果来判断程序是否出错。l 基本数据类型和表达式l 运算符与表达式l 程序的基本控制结构C+语言程序由以下基本部分组成。1. 函数函数一个C+程序

7、是由若干个函数构成的。函数分为库函数(标准函数)和自定义函数。库函数一般是由系统提供的。一个完整的C+语言程序只有一个主函数。2. 预处理命令预处理命令预处理命令以位于行首的符号“#”开始,C+提供的预处理有宏定义命令、文件包含命令和条件编译命令三种。 3. 程序语句程序语句一条完整的语句必须以分号“;”结束。程序语句有如下几类:(1)说明语句)说明语句用来说明变量的类型和初值。如下面语句是把变量说明为浮点数。float a,b,c;又如下面语句是把变量sum说明为整型变量,并赋初值为零。int sum=0;(2)表达式语句)表达式语句由一个表达式构成一个语句,用以描述算术运算、逻辑运算、或产

8、生某种特定动作,在任何表达式最后加一个分号“;”就构成了一个语句。(3)程序控制语句)程序控制语句用来描述语句的执行条件与执行顺序的语句,C+语言的控制语句有9种,如下页所示。其语句中的括号( )表示其中是条件,表示内嵌的语句。 (4)复合语句)复合语句复合语句是一种十分重要的语句,由大括号和把一些说明和语句组合在一起,使它们在语法上等价于一个简单语句;可由若干简单语句或复合语句组成。(5)函数调用语句)函数调用语句函数调用语句是由一次函数调用加一个分号而构成的一个语句。例如:max(x,y);(6)空语句)空语句空语句:;即只有分号“;”的语句,什么也不做。C+主要引进面向对象机制,包括类、

9、对象、派生类、继主要引进面向对象机制,包括类、对象、派生类、继承、多态等概念和语言机制,使之成为面向对象程序设承、多态等概念和语言机制,使之成为面向对象程序设计语言,它在传统的非面向对象方面,计语言,它在传统的非面向对象方面,C+对对C做了一做了一些补充。些补充。2.3.1 注释与续行注释与续行1、注释、注释 以下两条语句等价以下两条语句等价: x=y+z; /* This is a comment */ x=y+z; /This is a comment注注:1)以)以/开始的注释只在本行起作用,当注释内容为多行时用开始的注释只在本行起作用,当注释内容为多行时用/*/2)/*/方式的注释不能

10、嵌套,但可以嵌套方式的注释不能嵌套,但可以嵌套/方式的注释方式的注释2、过长的语句可用续行符、过长的语句可用续行符“”,如:,如:couthexxndecxnoctx”配套使用配套使用,Cout为输出和为输出和“x”用户从键盘中输入的数值自动转换为变量用户从键盘中输入的数值自动转换为变量x的类型,并存入变量的类型,并存入变量x内;内;l允许允许“cinabc” 的写法,它按书写顺序从键盘的写法,它按书写顺序从键盘上提取所要求的数据,并存入对应的变量。两个数据上提取所要求的数据,并存入对应的变量。两个数据间用空白符(空格、回车或间用空白符(空格、回车或Tab键分开);键分开);lCout 和和c

11、in输出输入数据时使用缺省的格式,也可以对输出输入数据时使用缺省的格式,也可以对输入和输出进行控制。输入和输出进行控制。lCout的输出中可以用的输出中可以用“n”和和“endl”作为换行控制作为换行控制符。符。例例#include void write (char *);void main()char name20;coutname;coutnamen;/操作符操作符dec/hex/oct的使用的使用int x=25;couthexxndecxnoctxendl;/函数原型的说明函数原型的说明write (how are you);void write (char * s)couts;C+中

12、变量声明比较灵活中变量声明比较灵活,允许在代码块中任何地方允许在代码块中任何地方说明说明,因此可以在需要时才声明因此可以在需要时才声明.但仍然要符合但仍然要符合”先先定义后使用定义后使用”的规定的规定.float fun(int x,int y) / 对形参直接进行说明对形参直接进行说明 for (int i=0;i10;i+) / 对循环变量对循环变量i进行说明进行说明 int sum=0; / 循环体内也可对变量循环体内也可对变量sum进行说明进行说明 sum=sum+i; coutsum=sum; int z=0; / 使用变量使用变量z时才说明它时才说明它 z=x+y; 例如例如:en

13、um booleFALSE,TRUE;struct string char * str; int length;union number int i; float f;C+在中在中, 定义变量时定义变量时,可以说明为可以说明为:boole done;string str;number x;u必须为每一个函数建立原型必须为每一个函数建立原型,说明函数的名称、参数类型说明函数的名称、参数类型与个数与个数,以及函数返回值的类型。以及函数返回值的类型。u目的是让目的是让C+编译程序进行类型检查(即形参与实参的类编译程序进行类型检查(即形参与实参的类型匹配检查),以及返回值是否与原型相符,维护程序型匹配

14、检查),以及返回值是否与原型相符,维护程序的正确性。的正确性。u语法:返回类型语法:返回类型 函数名(参数表)函数名(参数表);u函数的原型必须出现在函数的调用语句前。函数的原型必须出现在函数的调用语句前。 例例 函数原型的说明函数原型的说明。 #include void write(char *s); / 函数原型的说明 void main() write(Hello,world!); void write(char *s) couts; C+中一般用中一般用const取代取代C中的中的#define ,消除,消除#define的不的不安全性安全性例例2.6 #define的不安全性的不安全

15、性 #include main() int a=1; #define T1 a+a #define T2 T1-T1 cout T2 is T2endl; return 0; 例例2.7 用用const取代取代#define。 #include int main() int a=1; const T1=a+a; const T2=T1-T1; cout T2 isT2endl; return 0; 输出输出:T2 is 0 (1) 指向常量的指针指向常量的指针是指是指:一个指向常量的指针变量。一个指向常量的指针变量。例如例如: const char* pc=abcd; / 声明指向常量的指针声

16、明指向常量的指针 (2) 常指针常指针是指是指:把指针本身把指针本身,而不是它指向的对象声而不是它指向的对象声明为常量。例如明为常量。例如: char* const pc=abcd; / 常指针常指针 (3) 指向常量的常指针指向常量的常指针是指是指:这个指针本身不能改变这个指针本身不能改变,它所指向的值也不能改变。要声明一个指向常量的它所指向的值也不能改变。要声明一个指向常量的常指针常指针,二者都要声明为二者都要声明为const。例如。例如: const char* const pc=abcd;/指向常量的常指针指向常量的常指针lVoid作为指针的类型时表示不确定的类型作为指针的类型时表示不

17、确定的类型l可以声明可以声明void类型指针类型指针,但不能声明但不能声明void类型的变量类型的变量lVoid型指针是一种通用指针型指针是一种通用指针,任何类型的指针值可以赋给任何类型的指针值可以赋给void类型类型的指针变量的指针变量;已获值的已获值的void型指针型指针,如果要使用如果要使用(如输出如输出),则必须再进则必须再进行类型转换行类型转换.(如下例如下例)例例2.8 void型指针的使用。型指针的使用。#include void main()void* pc; int i=456;char c=a;pc=&i;cout*(int* )pcendl;/ 对PC进行转换pc

18、=&c;cout*(char*)pcendl;lInline 标志标志l当程序调用带当程序调用带inline的函数时的函数时,编译器将函数体插入到调编译器将函数体插入到调用该函数的语句之前用该函数的语句之前,程序运行时不再进行函数调用程序运行时不再进行函数调用.l内联函数可消除函数调用时的系统开销内联函数可消除函数调用时的系统开销,提高运行速度提高运行速度例例2.9 内联函数的使用内联函数的使用#include inline double circle(double r) / 内联函数内联函数 return 3.1416*r*r; int main() for (int i=1;i=3

19、;i+) coutr=i area= circle(i)endl; return 0;关于内联函数的几点说明关于内联函数的几点说明:u内联函数在第一次调用之前必须进行声明和内联函数在第一次调用之前必须进行声明和定义定义(函数前一定要加函数前一定要加inline)u内联函数体一般不能有循环语句和开关语句内联函数体一般不能有循环语句和开关语句u类结构中所在在类说明体内定义的函数都是类结构中所在在类说明体内定义的函数都是内联函数内联函数.u内联是用空间换时间内联是用空间换时间,因此一般只将较短的因此一般只将较短的函数定义为内联函数函数定义为内联函数C+允许实参个数与形参个数不同例如有一函数原型说明为

20、: int init(int x=5,int y=10);/要求在函数原型或函数定义中为参数指定缺省值.则x与y的缺省值分别为5与10。 以下的函数调用都是允许的: init(100,80); / x=100,y=80 init(25); / x=25,y=10/调用函数时,省略实参,C+自动以缺省值作为相应参数的值 init(); / x=5,y=10 说明:u在函数原型中,所有取缺省值的参数都必须出现在不取缺少值的参数的右边,如:Int fun(int I,int j=5,int k);Int fun(int I,int k,j=5);函数调用时,或省略某个参数时,则其后的参数都应省略,采

21、用缺省值,不允许某个参数省略后再给其后的参数指定参数值,如:Init(,20); 在在C+中中, 只要函数参数的类型不同只要函数参数的类型不同,或者参数的个数不同或者参数的个数不同,或者或者二者兼而有之二者兼而有之,两个或者两个以上的函数可以使用相同的函两个或者两个以上的函数可以使用相同的函数名。数名。 求绝对值的函数: int iabs(int I); long labs(long l); double fabs(double d); C+C+用同一个函数名用同一个函数名 abs( )abs( )实现上面,用函数参数来区别到底调用哪实现上面,用函数参数来区别到底调用哪个函数。所以把个函数。所

22、以把同一作用域内名字相同同一作用域内名字相同,但参数不同但参数不同的函数称为重载函的函数称为重载函数。这得益于函数原型不仅给出函数名,而且指出了参数类型。数。这得益于函数原型不仅给出函数名,而且指出了参数类型。 为了保证编译器根据参数类型识别重载函数,必须保证重载函数的参为了保证编译器根据参数类型识别重载函数,必须保证重载函数的参数不同。数不同。参数类型的次序参数个数参数类型重载函数的参数差别 以下几种可能出现二义性:1、同名函数,仅返回值类型不同,但参数相同;2、两同名函数,仅用const或引用使参数类型有所不同; ex 10. int print (const int & ); i

23、nt print (int ); 3、加修饰符使参数有所不同,取决于实参的具体类型; ex 11. void print (unsigned int ); void print (int ); / print (1l); /出错出错 print (1u); /正确正确4、缺省参数有时也能导致二义性; ex 12. void print ( int a, int b=1 ); void print (int a); / print(1); /二义性二义性 例例2.13 参数类型不同的重载函数参数类型不同的重载函数#includeint cube(int i) return i*i*i; floa

24、t cube(float f) return f*f*f; double cube(double d) return d*d*d;void main() int i=12; float f=3.4; double d=5.67; couti*i*i=cube(i)endl; coutf*f*f=cube(f)endl; coutd*d*d=cube(d)endl; 2.3.11 作用域标识符作用域标识符 例例2.16 使用作用域标识符的情况。使用作用域标识符的情况。#includeint avar;main()/局部变量具有较高的优先权 int avar; avar=25; / 局部变量ava

25、r :avar=10; / 全局变量avar coutlocal avar =avarendl; coutglobal avar =:avarendl; return 0;程序运行结果如下: local avar=25 global avar=10 #includevoid main() union int i;float f;i=20;/无名联合可通过使用其中数据项名字直接存取coutiendl; 在此无名联合中,声明了变量i和f具有相同的存储地址。 C+类型转换支持两种方式: int i=10; float x=float(i); 或float x=(float)i;l运算符new用于内存

26、分配,语法为: 指针变量 = new 类型名; l运算符delete释放new分配的存储空间,语法式为: delete 指针变量; l关于New /delete与malloc/freeunew 是个操作符,和“+”,“-”,“=”地位相等.而malloc是分配内存的函数,需要调用;u new是保留字,不需要头文件支持,malloc需要头文件库函数支持;unew 建立的是一个对象,malloc分配的是一块内存.unew建立的对象可以把它当成一个普通的对象,用成员函数访问,不要直接访问它的地址空,new和malloc有的区别,就好像是飞机和汽车有什么分别“,除了都是交通工具,其他的特征全是分别.

27、例例2.17 操作符操作符new和和delete的使用。的使用。 #include main() int *p; / 声明一个整型指针变量p p=new int; / 动态分配一个存放int型数据的内存 空间,并将首地址赋给p *p=10; cout*p; delete p; / 释放指针变量p指向的内存空间 return 0; u用new分配的,使用结束后只能用delete显式释放,否则这部分空间只能变成不能回收的死空间u使用new分配内存时,若内存不够,new将返回空指针(null),如:# include void main()int *p;p=new int;if (!p)coutal

28、location failureendl;*p=10;cout*p;delete p;u使用new可以为数组动态分配内存空间,此时需要在类型名后面缀上数组大小.语法:指针变量=new 类型名下标表达式如 int *p=new int10u释放动态分配的数组存储区时,使用delete.语法: delete指针变量如: delete pi;或delete10 pi;uNew可在为简单变量分配内存空间时进行初始化.语法:指针变量=new 类型名(初始值)如 int *p=new int(100)/动态分配内存并为其赋初始值99u使用new可以为数组动态分配内存空间,此时需要在类型名后面缀上数组大小.

29、语法:指针变量=new 类型名下标表达式如 int *p=new int10u释放动态分配的数组存储区时,使用delete.语法: delete指针变量如: delete pi;或delete10 pi;uNew可在为简单变量分配内存空间时进行初始化.语法:指针变量=new 类型名(初始值)如 int *p=new int(100)/动态分配内存并为其赋初始值99# include void main()/new 为简单变量分配内存空间的同时进行初始化为简单变量分配内存空间的同时进行初始化int *p=new int (99);if (!p)coutallocation failureendl

30、;cout*pendl;delete p;/给数组动态分配内存空间给数组动态分配内存空间int * A=new int10;if (!A)coutallocation failureendl;for (int i=0;i10;i+)Ai=2*i;coutAi ;deleteA; 1. 引用的概念引用的概念 引用通常被认为是某个变量的别名,声明一个引用的格式如下: 数据类型 & 引用名 = 已定义的变量名; 例如: int i=5; int& j=i; 其中j是一个整数类型的引用,用整型变量i对它进行初始化,j就可看作是变量i的别名 。i与j将同步更新,且使用内存的同一地址.例例2.22 引

温馨提示

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

评论

0/150

提交评论