1、第2章 C+基础知识第第2章章 C+基础知识基础知识本章学习要点本章学习要点从从C语言到语言到C+的发展历程的发展历程简单的简单的C+程序程序C+在面向过程程序设计方面在面向过程程序设计方面对对C的扩充的扩充C+的输入输出、数据类型、函数及指针的输入输出、数据类型、函数及指针C+的常变量、引用、名字空间、字符串变量的常变量、引用、名字空间、字符串变量C+程序的编写和实现程序的编写和实现2第第2章章 C+基础知识基础知识本章学习目标本章学习目标了解从了解从C语言到语言到C+的发展历程的发展历程对简单的对简单的C+程序有整体的感性认识程序有整体的感性认识掌握掌握C+在面向过程程序设计方面在面向过程
2、程序设计方面对对C的扩充的扩充掌握掌握C+的输入输出、数据类型、函数及指针的输入输出、数据类型、函数及指针掌握掌握C+的常变量、引用、名字空间、字符串变量的常变量、引用、名字空间、字符串变量熟悉熟悉C+程序的编写和实现流程程序的编写和实现流程34高级计算机语言举例图像来自图像来自 http:/www.engin.umd.umich.edu/CIS/course.des/cis400/2.1 从C语言到C+C+3.0C+2.0C+1.0带类的带类的CCC+4.0ANSI C+89年年,增加类增加类的多继承的多继承91年年,增增加模板加模板增加异常处理、名字空增加异常处理、名字空间、运行时类型识别
3、间、运行时类型识别97年年,美国美国C+标准正式发布标准正式发布56C语言的设计者语言的设计者Dennis M.Ritchie7C语言出现的历史背景语言出现的历史背景v C语言是在语言是在1972年至年至1973年间由美国的贝尔实验室的年间由美国的贝尔实验室的M.D.Ritchie和和K.Thompson以及英国剑桥大学的以及英国剑桥大学的M.Richards等为描述和实现等为描述和实现UNIX操作系统而设计的操作系统而设计的v最初的最初的C语言是附属于语言是附属于UNIX的操作系统环境,而它的的操作系统环境,而它的产生却可以更好地描述产生却可以更好地描述UNIX操作系统。时至今日,操作系统。
4、时至今日,C语言已独立于语言已独立于UNIX操作系统。它已成为微型、小型操作系统。它已成为微型、小型、中型、大型和超大型(巨型)计算机通用的一种程、中型、大型和超大型(巨型)计算机通用的一种程序设计语言。序设计语言。v随着随着C语言的不断发展、应用和普及,目前,语言的不断发展、应用和普及,目前,C语言语言已经能够在多种操作系统下运行,实用的已经能够在多种操作系统下运行,实用的C语言编译语言编译系统种类繁多,如系统种类繁多,如Microsoft C、Turbo C等。等。8D M.Ritchie和和Unix的设计者的设计者Ken Thompson接受美国国家技术勋章接受美国国家技术勋章C+的设计
5、者的设计者Bjarne Stroustrup9C+发展的历史背景发展的历史背景v目的是试图去分析目的是试图去分析UNIX的内核,并取名的内核,并取名为为“C with class”。v为了避免受到为了避免受到C语言的局限性,参考了语言的局限性,参考了很多的语言很多的语言 C+从从 Simula继承了继承了类类的概念的概念 从从Algol68继承了继承了运算符重载、引用以及在运算符重载、引用以及在任何地方声明变量的能力任何地方声明变量的能力,从从BCPL获得了获得了/注释,注释,从从Ada得到了得到了模板、名字空间和异常模板、名字空间和异常。10C与与C+C+虽然主要是以虽然主要是以C的基础发展
6、起来的一的基础发展起来的一门新语言,但他不是门新语言,但他不是C的替代品,不是的替代品,不是C的升级,的升级,C+和和C是兄弟关系,没有谁比是兄弟关系,没有谁比谁先进的说法;谁先进的说法;更重要的一点是更重要的一点是C和和C+各自的标准委员各自的标准委员会是独立的,最新的会是独立的,最新的C+标准是标准是C+98,最新的最新的C标准是标准是C99。11v下面看几个简单的下面看几个简单的C+程序程序【例2-1】在屏幕上输出一行字符“Hello C+!”。#include /包含头文件命令包含头文件命令using namespace std;/使用名字空间使用名字空间stdint main()co
7、utHello C+!”,叫,叫“提提取取”;cout对象对象和和cerr对象对象屏幕输出的运算符屏幕输出的运算符为为“”,叫,叫“插入插入”。14练习练习1.写一个写一个C+程序,完成在屏幕上输出:程序,完成在屏幕上输出:Hello C+!This is my frist program!2.写一个函数,完成两个整型变量的交换写一个函数,完成两个整型变量的交换,并在,并在main函数中完成子函数的调用函数中完成子函数的调用。【例例2-2】通过函数求两个整数通过函数求两个整数a和和b的和。的和。#include /包含头文件命令包含头文件命令using namespace std;/使用名字空
8、间使用名字空间stdint sum(int x,int y)return x+y;/求和函数求和函数int main()int a,b;/定义两个变量定义两个变量a和和b coutInput to a and b:ab;/等待用户从键盘输入数据等待用户从键盘输入数据 couta+b=sum(a,b)endl;return 0;2.2 简单简单C+程序程序C+的函数和C语言的函数非常相似 函数的使用仍然需要先声明后使用。如果函数定义在函数调用之后,则必须在前面声明函数原型注意16#include /包含头文件命令包含头文件命令using namespace std;/使用名字空间使用名字空间st
9、dint main()int a,b;/定义两个变量定义两个变量a和和b coutInput to a and b:ab;/等待用户从键盘输入数据等待用户从键盘输入数据 int sum(int x,int y);/sum函数原型声明函数原型声明 couta+b=sum(a,b)endl;return 0;int sum(int x,int y)return x+y;/求和函数求和函数2.2 简单简单C+程序程序变量可以在程序的变量可以在程序的任何地方定义,但任何地方定义,但要在使用前要在使用前172.2 简单简单C+程序程序【例例2-3】声明一个关于人的类声明一个关于人的类PersonPers
10、on,人的信息包括,人的信息包括姓名、性别、年龄,程序运行后,我们可以输入自己姓名、性别、年龄,程序运行后,我们可以输入自己的信息,也可以显示自己的信息。的信息,也可以显示自己的信息。#include /包含头文件命令包含头文件命令 using namespace std;/使用名字空间使用名字空间std class Person int main();return 0;182.2 简单简单C+程序程序class Person /类的声明类的声明public:/以下为类的公用成员函数以下为类的公用成员函数void SetInfo()/公用成员函数公用成员函数SetInfo coutnamese
11、xage;void Show()/公用成员函数公用成员函数Show cout name:name;cout sex:sex;cout age:ageendl;private:/以下为类的私有数据成员以下为类的私有数据成员char name20;/私有数据成员私有数据成员namechar sex2;/私有数据成员私有数据成员sexint age;/私有数据成员私有数据成员age;/类声明结束,此处必须有分号类声明结束,此处必须有分号 192.2 简单简单C+程序程序int main()/main函数函数 /定义定义Person类的两个对象类的两个对象person1,person2Person p
12、erson1,person2;person1.SetInfo();/对象对象person1信息输入信息输入person2.SetInfo();/对象对象person2信息输入信息输入person1.Show();/对象对象person1信息输出信息输出person2.Show();/对象对象person2信息输出信息输出return 0;20注意:注意:类的声明和对象的定义的语法形式。类中的成员分为数据成员和成员函数,成员的可见性分为 3种:公用、私有、受保护。类的概念的理解:类是一种用户自定义数据类型,它是不占用实际存储空间的。对象的理解:对象是类类型的变量,系统会为对象分配内存空间。2.2
13、 简单简单C+程序程序212.3 C+对对C的扩充的扩充v在输入输出方面的扩充在输入输出方面的扩充v对数据类型的扩充对数据类型的扩充v常变量常变量v在指针方面的扩充在指针方面的扩充v引用的概念引用的概念v在函数方面的扩充在函数方面的扩充v名字空间的概念名字空间的概念v字符串变量字符串变量本章重点本章重点222.3.1 C+的输入输出的输入输出vC语言输入输出的实现语言输入输出的实现 通过输入输出库函数实现通过输入输出库函数实现 C语言的输入输出存在着格式复杂、无法保证安语言的输入输出存在着格式复杂、无法保证安全性、无法对自定义类型整体输入输出等缺点全性、无法对自定义类型整体输入输出等缺点v C
14、+对对C输入输出的扩充输入输出的扩充 C+的输入的输入/输出(输出(I/O)流类库)流类库“流流”的思想的思想 cout、cin对象对象,运算符运算符232.3.2 数据类型的扩展数据类型的扩展空类型引用类型指针类型类类型共用体类型结构体类型数组类型枚举类型构造类型布尔型长双精度型双精度型单精度型浮点型字符型长整型整型短整型整型基本类型数据类型新增数新增数据类型据类型功能进行功能进行了扩充了扩充24布尔类型(布尔类型(bool)vbool、false和和true均为均为C+关键字。关键字。v系统将系统将false的值转换为的值转换为0,将,将true的值转的值转换为换为1,就有,就有false
15、true。vbool型数据占据型数据占据1字节内存。字节内存。25vC+对对C语言的语言的结构体、共用体、枚举结构体、共用体、枚举等自定义数据类型做了扩充。等自定义数据类型做了扩充。2.3.2 数据类型的扩展数据类型的扩展26struct Student int num;char name20;char sex;void display()coutnum=numendl;coutname=nameendl;coutsex=sexendl;2.3.2 数据类型的扩展数据类型的扩展27struct Student private:int num;char name20;char sex;publi
16、c:void display()coutnum=numendl;coutname=nameendl;coutsex=sexendl;StudentStudent stud1,stud2;stud1,stud2;2.3.2 数据类型的扩展数据类型的扩展28在在C+中用中用结构体类型名、共用体类型名、结构体类型名、共用体类型名、枚举类型名枚举类型名定义变量时,不必定义变量时,不必在类型名前在类型名前加加上上前缀前缀struct、union、enum。2.3.2 数据类型的扩展数据类型的扩展29struct student char ID15;char name20;int age;union xy
17、 int x;char y;enum color black,white,redstudent stud;xy x1;color col;struct student stud;unoin xy x1;enum color col;C语语言言C+2.3.2 数据类型的扩展数据类型的扩展302.3.3 用用const定义常变量定义常变量v直接常量和符号常量直接常量和符号常量v使用符号常量需要注意的问题:使用符号常量需要注意的问题:运行时不分配内存单元运行时不分配内存单元 符号常量没有类型,在编译时不进行类型符号常量没有类型,在编译时不进行类型检查检查 注意替换后的表达式和预想的表达式是否注意替换
18、后的表达式和预想的表达式是否一致一致#define PI 3.14159#define R 1+2 coutPI*R*Rendl;输出语句输出的并不是输出语句输出的并不是 3.14159*(1+2)*(1+2),而是而是 3.14159*1+2*1+2。312.3.3 用用const定义常变定义常变量量v为了使常量也能像变量那样进行类型检为了使常量也能像变量那样进行类型检查,查,C+提供了用提供了用const定义常变量的方定义常变量的方法法v定义常变量的语法:定义常变量的语法:const float PI=3.14159;注意:注意:常变量要在定义的同时进行初始化,常变量要在定义的同时进行初始
19、化,可以是具体的数值,也可以是表达式。可以是具体的数值,也可以是表达式。32【例例2-4】利用常变量计算圆的面积。利用常变量计算圆的面积。#include using namespace std;int main()const float PI=3.14;/定义常变量定义常变量 float radius=0;coutradius;coutThe area of circle is:PI*radius*radiusendl;return 0;2.2 简单简单C+程序程序注意注意constconst的位置,一般见到的的位置,一般见到的constconst的位置可能在的位置可能在类型的前面,但是类型
20、的前面,但是constconst也可以在变量名前面,并且也可以在变量名前面,并且两者的含义完全相同。两者的含义完全相同。注意 float const PI=3.14;/定义常变量定义常变量332.3.5 引用引用v引用引用就是某一变量的就是某一变量的别名别名,对引用的,对引用的操作与对变量直接操作完全一样操作与对变量直接操作完全一样 v引用的声明方法引用的声明方法 类型标识符类型标识符&引用名引用名=目标变量名目标变量名;342.3.5 引用引用vint a;vint&b=a;20地址地址2000变量变量a引用引用bv在声明一个引用时,引用前面的类型标示在声明一个引用时,引用前面的类型标示符是
21、指目标变量的类型,且必须同时使之符是指目标变量的类型,且必须同时使之初始化,即声明它代表哪一个变量初始化,即声明它代表哪一个变量.35【例例2-12】使用引用访问变量。使用引用访问变量。#include using namespace std;int main()int x=100;/定义整型变量定义整型变量x int&rx=x;/定义变量定义变量x的引用的引用rx coutrx=rxendl;/输出引用输出引用rx的内容的内容 rx=200;/给引用给引用rx赋值赋值 coutx=xendl;/输出变量输出变量x的内容的内容 return 0;程序运行结果如下:程序运行结果如下:rx=100
22、 x=2002.3.5 引用引用36补充:关于引用的简单说明补充:关于引用的简单说明v(1)引用并不是一种独立的数据类型,)引用并不是一种独立的数据类型,声明引用时必须指定其代表某一类型的实声明引用时必须指定其代表某一类型的实体(如变量、类对象),即对它初始化。体(如变量、类对象),即对它初始化。int a;int&b=a;int&b;float a;int&b=a;37v(2)引用与其所代表的变量共享同一内)引用与其所代表的变量共享同一内存单元,系统并不为引用另外分配存储空存单元,系统并不为引用另外分配存储空间。间。int a=3;int&b=a;cout&a“&bendl;补充:关于引用的
23、简单说明补充:关于引用的简单说明38int a=3;int&b=a;/声明声明b是整型变量的别名是整型变量的别名int&c=b;/声明声明c是整型引用是整型引用b的别名的别名v(3)对引用的初始化,可以用一个变量)对引用的初始化,可以用一个变量名,也可以用另一个引用。如:名,也可以用另一个引用。如:补充:关于引用的简单说明补充:关于引用的简单说明39v(4)引用在初始化后不能再被重新声明)引用在初始化后不能再被重新声明为另一变量的别名。为另一变量的别名。int a=3,b=4;int&c=a;int&c=b;/企图重新声明企图重新声明c为整型变量为整型变量b的别名的别名补充:关于引用的简单说明
24、补充:关于引用的简单说明40v(5)当当&a的前面有类型符时(如的前面有类型符时(如 int&a),它必然是对引用的声明;如果前面没有类型符它必然是对引用的声明;如果前面没有类型符时(时(p=&a),此时的,此时的&是取地址运算符。是取地址运算符。int a=3,b=4;int&c=a;int*p=&b;补充:关于引用的简单说明补充:关于引用的简单说明41引用的使用引用的使用#include int main()int a=1;int c=10;int&b=a;cout a ,b,c endl;b=c;cout a ,b,c endl;b=20;cout a ,b,c endl;程序运行结果:
25、程序运行结果:1 1,1 1,10101010,1010,10102020,2020,1010定义引用定义引用b,并将,并将其作为其作为a的别名的别名将将c的值赋给的值赋给b,不是,不是将将b作为作为c的别名的别名v实际上,在实际上,在C+程序中很少使用独立变量的引程序中很少使用独立变量的引用,如果要使用某一个变量,就直接使用它的用,如果要使用某一个变量,就直接使用它的原名,没有必要故意使用它的别名。前面举的原名,没有必要故意使用它的别名。前面举的例子只是为了说明引用的特征和基本的用法。例子只是为了说明引用的特征和基本的用法。vC+之所以增加之所以增加“引用引用”,主要是利用它作为,主要是利用
26、它作为函数参数,以扩充函数传递数据的功能函数参数,以扩充函数传递数据的功能补充:关于引用的简单说明补充:关于引用的简单说明43在在C语言中,函数的参数传递有以下两种情况:语言中,函数的参数传递有以下两种情况:v(1)值传递:)值传递:将变量名作为形参和实参。将变量名作为形参和实参。此时传递给形参的是实参变量的值,此时传递给形参的是实参变量的值,数据传递是单向的,在函数执行期间数据传递是单向的,在函数执行期间形参值发生变化并不回传给实参。形参值发生变化并不回传给实参。44补充:关于引用的简单说明补充:关于引用的简单说明v(2)地址传递:)地址传递:形参是指针变量,实参是变量的地址。形参是指针变量
27、,实参是变量的地址。函数调用时,形参指向实参变量单元,函数调用时,形参指向实参变量单元,数据传递是双向的。数据传递是双向的。45补充:关于引用的简单说明补充:关于引用的简单说明v【例例2-13】编写一个函数,交换两个整型变量编写一个函数,交换两个整型变量的值。的值。v(1)值传递:)值传递:教材教材3510 x20y1020 xy201046v(2)地址传递:传递变量的地址(指针)地址传递:传递变量的地址(指针)v【例例2-13】编写一个函数,交换两个整型变量编写一个函数,交换两个整型变量的值。的值。10 x20y*x*y201047v(3)引用传递:)引用传递:v【例例2-13】编写一个函数
28、,交换两个整型变量编写一个函数,交换两个整型变量的值。的值。48#include using namespace std;void swap(int&x,int&y)int tmp;tmp=x;x=y;y=tmp;int main()int x=10,y=20;cout交换前:交换前:x=x,y=yendl;swap(x,y);cout交换后:交换后:x=x,y=yendl;return 0;2.3.5 引用引用 别名别名x10变量变量x20变量变量y 别名别名y102049对引用的进一步说明对引用的进一步说明v(1)不能建立数组的引用。)不能建立数组的引用。“引用引用”只能是变量或对象的引用
29、。数组是只能是变量或对象的引用。数组是具有某种类型的数据的集合,其名字表示该具有某种类型的数据的集合,其名字表示该数组的起始地址而不是一个变量。所以不能数组的起始地址而不是一个变量。所以不能建立数组的引用。建立数组的引用。char c6=“hello”;char&rc=c;50v(2)可以将变量的引用的地址赋给一个指针)可以将变量的引用的地址赋给一个指针,此时指针指向的是原来的变量,如,此时指针指向的是原来的变量,如 int a=3;int&b=a;int*p=&b;对引用的进一步说明对引用的进一步说明51v(3)可以建立指针变量的引用,如)可以建立指针变量的引用,如 int i=3;int*
30、p=&i;int*&pt=p;对引用的进一步说明对引用的进一步说明52v(4)可以用)可以用const对引用加以限定,不允许对引用加以限定,不允许改变该引用的值。如改变该引用的值。如 int i=5;const int&a=i;a=3;v但可以但可以 i=3 对引用的进一步说明对引用的进一步说明53 利用常引用作为函数形参,既能提高程序的执行利用常引用作为函数形参,既能提高程序的执行效率,又能保护传递给函数的数据不在函数中被效率,又能保护传递给函数的数据不在函数中被改变,达到保护实参的目的改变,达到保护实参的目的 对引用的进一步说明对引用的进一步说明void show(const int&x)
31、x=8;cout“x=“xendl;54 v引用作为函数的返回值引用作为函数的返回值 v【例【例2-14】2.3.5 引用引用55练习练习#includeusing namespace std;int main()int a=12,b=639,c=78;void exchange(int,int,int);void fun(int,int);exchange(a,b,c);couta=a,b=b,c=cendl;return 0;void exchange(int&a,int&b,int&c)if(ab)fun(a,b);if(ac)fun(a,c);if(bc)fun(b,c);void f
32、un(int&a,int&b)int p;p=a;a=b;b=p;2.3.4 指针指针v指针指针 指针是一个重要概念,如果使用得当可以使指针是一个重要概念,如果使用得当可以使程序高效、简洁、紧凑。如果对指针掌握不程序高效、简洁、紧凑。如果对指针掌握不牢固,编程则会出现意想不到的错误牢固,编程则会出现意想不到的错误 指针是内存单元的地址指针是内存单元的地址 经常所讲的指针是指针变量的简称,是用来经常所讲的指针是指针变量的简称,是用来存放指针(地址)的变量。存放指针(地址)的变量。v本节重点讨论本节重点讨论C+中使用指针需要注中使用指针需要注意的地方意的地方 572.3.4.1 指针与0v空指针空
33、指针 空指针表示空指针表示“未分配未分配”或者或者“尚未指向尚未指向任何地方任何地方”的指针的指针 空指针一般用来判断内存分配是否成功空指针一般用来判断内存分配是否成功 注意:注意:“空指针空指针”与与“野指针野指针”的区别的区别 在指针上下文中的常数在指针上下文中的常数0被编译成空指针被编译成空指针 程序员更常使用符号常量程序员更常使用符号常量NULL来表示空来表示空指针指针 未初始化的指针未初始化的指针58【例例2-5】指针与指针与0。#include using namespace std;int main()int*p=0;/定义空指针定义空指针pint*q;/定义野指针定义野指针qi
34、nt x=100;/定义整型变量定义整型变量x并初始化为并初始化为100/*p=50;/若执行则编译出错,不能使用空指针若执行则编译出错,不能使用空指针*q=50;/编译通过,但不知把编译通过,但不知把50写到何处写到何处p=q=&x;/使指针使指针p和和q都指向变量都指向变量xif(p!=0)/判断指针判断指针p是否为空指针是否为空指针cout*p *qendl;/输出变量输出变量x的值的值 return 0;2.2 简单简单C+程序程序int *p=NULL59C+系统规定空指针是不系统规定空指针是不能使用的,如果程序中出能使用的,如果程序中出现使用空指针的语句则编现使用空指针的语句则编译
35、会报错,编译不能通过。译会报错,编译不能通过。2.3.4.2 指针与指针与constint *p=NULLconst int *p=NULLint const *p=NULL指向指向const变量的指针变量的指针int*const p=NULLconst指针指针602.3.4.2 指针与指针与const【例例2-6】指向指向const变量的指针。变量的指针。include using namespace std;int main()const int*p=NULL;/定义指向定义指向const变量的指针变量的指针pconst int a=10;/定义常变量定义常变量ap=&a;/指针指针p指向
36、指向acout*p=*pendl;/输出输出p所指向单元的内容所指向单元的内容int b=100;/定义普通变量定义普通变量bp=&b;/指针指针p指向指向bcout*p=*pendl;/输出输出p所指向单元的内容所指向单元的内容/*p=200;/错误,不能通过错误,不能通过p修改修改p所指向单元内容所指向单元内容b=200;cout*p=*pendl;/输出输出p所指向单元的内容所指向单元的内容return 0;通过本例可以看到可以改变通过本例可以看到可以改变指向指向const变量的指针的指变量的指针的指向,但是不能通过指针修改向,但是不能通过指针修改指针指向单元内容。指针指向单元内容。61
37、2.3.4.2 指针与const【例例2-7】const指针。指针。#include using namespace std;int main()int a=10;/定义普通变量定义普通变量aint b=100;/定义普通变量定义普通变量bint*const p=&a;/定义定义const指针指针p并初始化指向并初始化指向acout*p=*pendl;/输出输出p所指向单元内容所指向单元内容/p=&b;/错误,不能改变错误,不能改变const指针指针p的指向的指向*p=100;/通过指针修改通过指针修改p所指向单元内容所指向单元内容cout*p=*pendl;/输出输出p所指向单元内容所指向单
38、元内容return 0;通过本例可以看到可以改通过本例可以看到可以改变变const指针指向单元的指针指向单元的内容,但是不能改变内容,但是不能改变const指针的指向。指针的指向。622.3.4.2 指针与指针与const【例例2-8】指向指向const变量的变量的const指针。指针。#include using namespace std;int main()int a=10;int b=100;/定义指向定义指向const变量的变量的const指针指针p const int*const p=&a;cout*p=*pendl;/输出输出p所指向单元内容所指向单元内容/p=&b;/错误,不能
39、改变指针错误,不能改变指针p的指向的指向/*p=100;/错误,不能改变错误,不能改变p所指向单元的内容所指向单元的内容return 0;对于指向对于指向const变量变量的的const指针,既不指针,既不能改变指针指向单能改变指针指向单元的内容,也不能元的内容,也不能改变指针的指向。改变指针的指向。632.3.4.2 指针与指针与constv小结小结指针和指针和const的关系比较复杂,的关系比较复杂,const有三个位有三个位置,可形成两种指针:置,可形成两种指针:const int *p=NULLint const *p=NULL指向指向const变量的指针变量的指针int*const
40、p=NULLconst指针指针642.3.4.2 指针与指针与constv小结小结指针和指针和const的关系比较复杂,的关系比较复杂,const有两个位有两个位置,可形成三种指针:置,可形成三种指针:const int *const p=NULLint const *const p=NULL指向指向const变量的变量的const指针:指针:652.3.4.3 void指针指针vvoid在作为函数类型和参数类型时为空在作为函数类型和参数类型时为空类型,表示没有返回值或参数。类型,表示没有返回值或参数。vvoid修饰指针时称为修饰指针时称为“无类型指针无类型指针”,表示该指针可以指向任意类型的
41、变量。表示该指针可以指向任意类型的变量。v虽然虽然void指针可以指向任意类型的数据指针可以指向任意类型的数据,但是在使用,但是在使用void指针时必须对其进行指针时必须对其进行强制类型转换,转换成它所指向单元的强制类型转换,转换成它所指向单元的实际类型,然后才可以使用。实际类型,然后才可以使用。662.3.4.3 void指针指针【例例2-9】void指针的声明与使用。指针的声明与使用。#include using namespace std;int main()int x=100;void*p=&x;/定义定义void指针指针p指向指向x int*q=NULL;/定义整型指针定义整型指针q
42、 /cout*p=*pendl;/错误错误 cout*p=*(int*)pendl;/正确正确 /q=p;/错误错误 q=(int*)p;/正确正确 cout*q=*qendl;/输出指针输出指针q指向单元内容指向单元内容 return 0;672.3.4.3 void指针指针v为什么要使用为什么要使用void指针指针 因为因为void指针可以指向任意类型的数据,所指针可以指向任意类型的数据,所以使用以使用void指针时把指针时把void指针所指向的数据指针所指向的数据给抽象化了,这样可以增加程序的通用性给抽象化了,这样可以增加程序的通用性 v使用使用void指针的两个例子指针的两个例子voi
43、d*memcpy(void*dest,const void*src,size_t len);void*malloc(unsigned int size);682.3.4.4 new和和deletevC语言的动态内存管理语言的动态内存管理 malloc()和和free()函数函数 主要缺点主要缺点 函数的返回值是函数的返回值是void*类型类型 分配内存单元时根据参数分配内存单元时根据参数size的值来分配,无法的值来分配,无法检查错误检查错误 分配到的内存单元无法初始化分配到的内存单元无法初始化vC+中使用中使用new和和delete运算符进行动态运算符进行动态内存管理内存管理P2969【例例
44、2-11】使用使用new和和delete动态管理内存单元。动态管理内存单元。#include using namespace std;int main()int*p=NULL;p=new int;cout*p=*pendl;delete p;return 0;2.3.4.4 new和和delete70v申请内存空间并进行初始化申请内存空间并进行初始化 指针变量指针变量=new 数据类型数据类型(初值初值);v分配多个连续变量的存储空间分配多个连续变量的存储空间 使用使用new 和和delete 指针变量指针变量=new 数据类型数据类型元素个数元素个数;delete 指针变量指针变量;:兼容兼
45、容C语言的语言的malloc/free方式方式,单个变量的单个变量的new/delete方式方式,多多个变量的个变量的new/delete 方式方式 2.3.4.4 new和和delete71v面向过程的面向过程的C+程序中的函数与程序中的函数与C语言语言中的函数基本相同中的函数基本相同v面向对象的面向对象的C+程序中的函数有成员程序中的函数有成员函数和公共函数之分函数和公共函数之分v主要讨论面向过程的主要讨论面向过程的C+程序中函数程序中函数与与C语言函数的区别语言函数的区别2.3.6 函数函数722.3.6.1 函数原型声明函数原型声明v在函数尚未定义的情况下,先将函数的形式告在函数尚未定
46、义的情况下,先将函数的形式告诉编译系统,以便编译能够正常进行诉编译系统,以便编译能够正常进行 v函数原型声明的语法形式有两种:函数原型声明的语法形式有两种:(1)返回值类型)返回值类型 函数名函数名(参数类型参数类型1,参数类型参数类型2,.);(2)返回值类型)返回值类型 函数名函数名(参数类型参数类型1 参数名参数名1,参数类型参数类型2 参数名参数名2,.);函数原型声明和函数定义是不同的。函数原型声明不是一个独立的完整的函数单位,它仅仅是一条语句,因此在函数原型声明后面一定要加上分号。732.3.6.2 函数默认参数函数默认参数v在多次调用一个函数将实参传递给形参时,其在多次调用一个函
47、数将实参传递给形参时,其中可能有一个或几个参数,它们传递进来的实中可能有一个或几个参数,它们传递进来的实参值多次相同参值多次相同v在定义或声明函数时,给形参一个默认值,如在定义或声明函数时,给形参一个默认值,如果在调用时没有给该形参传递实参值,则使用果在调用时没有给该形参传递实参值,则使用默认值作为该形参的值;如果调用时给该形参默认值作为该形参的值;如果调用时给该形参传递了实参值,则使用实参的值作为该形参的传递了实参值,则使用实参的值作为该形参的值。值。742.3.6.2 函数默认参数函数默认参数【例例2-16】求两个或三个正整数中的最大值,使用带有求两个或三个正整数中的最大值,使用带有默认参
48、数的函数实现。默认参数的函数实现。#include using namespace std;int main()int max(int,int,int=0);/带有默认参数的函数原型声明int a=5,b=8,c=10;coutmax of a and b is:max(a,b)endl;coutmax of a,b and c is:max(a,b,c)endl;return 0;/定义带有默认参数的函数int max(int a,int b,int c=0)if(a b)a=b;if(a c)a=c;return a;752.3.6.2 函数默认参数函数默认参数1.1.指定默认值参数默认值
49、的位置:为了避免混淆,最指定默认值参数默认值的位置:为了避免混淆,最好只在函数原型声明时指定默认值。好只在函数原型声明时指定默认值。2.2.当只有部分形参带有默认值时,带有默认值的参数当只有部分形参带有默认值时,带有默认值的参数必须放在形参表的右端。必须放在形参表的右端。3.3.当一个函数既是重载函数,又是带有默认参数的函当一个函数既是重载函数,又是带有默认参数的函数时,要注意不要出现二义性的问题数时,要注意不要出现二义性的问题调用带有默认参数的函数时,实参的个数可以与形调用带有默认参数的函数时,实参的个数可以与形参的个数不同,对于实参未给出的,可以从形参的参的个数不同,对于实参未给出的,可以
50、从形参的默认值中获得,利用这一特性,可以使函数的使用默认值中获得,利用这一特性,可以使函数的使用更加灵活。更加灵活。762.3.6.2 函数默认参数函数默认参数练习:有函数如下:练习:有函数如下:int add(int x=5,int y=6)int add(int x=5,int y=6)return x+y;return x+y;问这个函数可以有几种不同的调用形问这个函数可以有几种不同的调用形式?式?772.3.6.2 函数默认参数函数默认参数下面函数原型声明哪个是正确的?哪下面函数原型声明哪个是正确的?哪个是错误的?个是错误的?int add(int x,int y=5,int z=6)
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。