1、计算机技术基础系列课程课件计算机技术基础系列课程课件1 数组数组计算机技术基础系列课程课件计算机技术基础系列课程课件一维数组的定义一维数组的定义v一般语法形式一般语法形式数据类型数据类型 数组名数组名 常量表达式常量表达式v例:例:int a10float s5计算机技术基础系列课程课件计算机技术基础系列课程课件一维数组初始化一维数组初始化v在定义一个数组的同时对数组元素赋初值在定义一个数组的同时对数组元素赋初值例:例:int a5=1,2,3,4,5,b;v可以仅对一部分下标元素赋初值可以仅对一部分下标元素赋初值例:例:int a5=1,2,3;v对数组中全部元素赋初值为对数组中全部元素赋初
2、值为0例:例:int a5=0;v如果对数组的元素全部赋初值,可以省略如果对数组的元素全部赋初值,可以省略定义元素个数定义元素个数例:例:int a=1,2,3,4,5,6;计算机技术基础系列课程课件计算机技术基础系列课程课件二维数组二维数组计算机技术基础系列课程课件计算机技术基础系列课程课件二维数组的定义二维数组的定义v一般语法形式一般语法形式数据类型数据类型 数组名数组名 常量表达式常量表达式1 常量表达式常量表达式2v例:例:int a35;float s63;计算机技术基础系列课程课件计算机技术基础系列课程课件二维数组初始化二维数组初始化v在定义一个数组的同时对数组元素赋初值在定义一个
3、数组的同时对数组元素赋初值 例:例:int a25=1,2,3,4,5,4,5,6,7,8;将各元素的初值写在一个大括号里将各元素的初值写在一个大括号里 例:例:int a25=1,2,3,4,5,6,7,8,9,0;v可以仅对一部分下标元素赋初值可以仅对一部分下标元素赋初值例:例:int a25=1,2,3,4,5;例:例:int a25=1,2,3,4,5,6;v对数组中全部元素赋初值为对数组中全部元素赋初值为0例:例:int a25=0;计算机技术基础系列课程课件计算机技术基础系列课程课件2 字符数组和字符串字符数组和字符串计算机技术基础系列课程课件计算机技术基础系列课程课件字符数组的定
4、义字符数组的定义v在C+的基本数据类型变量中没有字符串变量,采用字符型数组来存放字符串。字符型数组定义的一般语法形式为:char 数组名 常量表达式例:char c10;char s20;计算机技术基础系列课程课件计算机技术基础系列课程课件字符数组的初始化字符数组的初始化v字符数组引用方法及其他类型的数组基本相同。字符数组引用方法及其他类型的数组基本相同。例:例:char a20=T,h,i,s,i,s,a,b,o,o,k;char b10=program;int i;coutaendl;for(i=1;i=20;i+)coutai;coutendl;coutbendl;计算机技术基础系列课程
5、课件计算机技术基础系列课程课件指针指针计算机技术基础系列课程课件计算机技术基础系列课程课件3 指针变量的声明指针变量的声明v一般语法格式一般语法格式 数据类型数据类型 *指针变量名;指针变量名;其中:其中:v数据类型数据类型-可以是任意类型,指的是指针所指可以是任意类型,指的是指针所指向的对象的数据类型。这说明了指针所指的内存向的对象的数据类型。这说明了指针所指的内存单元可以有用于存放什么类型的数据,称之为指单元可以有用于存放什么类型的数据,称之为指针的类型。针的类型。例:例:int*p;/指针指针p用来存放用来存放int型数据的地址型数据的地址 float*a;/指针指针p用来存放用来存放f
6、loat型数据的地址型数据的地址 计算机技术基础系列课程课件计算机技术基础系列课程课件“*”和和“&”v*称为指针运算符,表示指针所指向的变量的值称为指针运算符,表示指针所指向的变量的值*出现在声明语句中的被声明变量之前时,表示被声明出现在声明语句中的被声明变量之前时,表示被声明的变量是指针变量。如:的变量是指针变量。如:int*p;*出现在执行语句中或声明语句的初值表达式中时,表出现在执行语句中或声明语句的初值表达式中时,表示访问指针所指对象的内容。如:示访问指针所指对象的内容。如:cout*p;v&取地址运算符,用来得到一个对象的地址取地址运算符,用来得到一个对象的地址&出现在声明语句中的
7、被声明变量之前时,表示声明的出现在声明语句中的被声明变量之前时,表示声明的引用。如:引用。如:int&x;&出现在执行语句中或声明语句的初值表达式中时,表出现在执行语句中或声明语句的初值表达式中时,表示取对象的地址。示取对象的地址。如:如:int a;int*p;a=1;p=&a;couta=a p=pendl;计算机技术基础系列课程课件计算机技术基础系列课程课件4 指针运算指针运算v指针是一种数据类型,及其他数据类型指针是一种数据类型,及其他数据类型一样,指针变量也可以参及部分运算,一样,指针变量也可以参及部分运算,主要是主要是算术运算算术运算、关系运算关系运算和和赋值运算赋值运算,只是运算
8、规则比较特殊。只是运算规则比较特殊。指针变量的算术运算主要是加减运算,指针指针变量的算术运算主要是加减运算,指针加减运算的结果及指针的数据类型密切相关。加减运算的结果及指针的数据类型密切相关。如:如:计算机技术基础系列课程课件计算机技术基础系列课程课件指针变量的引用指针变量的引用v例:例:#includeusing namespace std;void main()int a,b,*p1,*p2;p1=&a;p2=&b;*p1=123;*p2=456;couta=aendl;coutp1=p1endl;coutb=bendl;coutp2=p2endl;计算机技术基础系列课程课件计算机技术基础
9、系列课程课件5 指针及数组指针及数组#include using namespace std;void main()int a8,*p;p=&a0;*p=123;p+;*p=456;couta0=a0endl;couta1=a1endl;计算机技术基础系列课程课件计算机技术基础系列课程课件指针及多维数组指针及多维数组#includeusing namespace std;void main()int a33=1,2,3,4,5,6,7,8,9,i,j,*p;for(i=0;i3;i+)for(j=0;j3;j+)p=&a00+i*3+j;cout*p ;coutendl;计算机技术基础系列课程
10、课件计算机技术基础系列课程课件指针及多维数组指针及多维数组#includeusing namespace std;void main()int a33=1,2,3,4,5,6,7,8,9,i,j,*p;for(i=0;i3;i+)for(j=0;j3;j+)p=ai+j;cout*p ;coutendl;计算机技术基础系列课程课件计算机技术基础系列课程课件6 指针及字符串指针及字符串#includeusing namespace std;void main()char a15=abcdefg,i,*p;p=&a0;for(i=0;i15;i+)if(*p=0)break;cout*p;p+;c
11、outendl;计算机技术基础系列课程课件计算机技术基础系列课程课件7 动态存储分配动态存储分配v一般语法形式一般语法形式new 数据类型数据类型 整型表达式整型表达式1 整型表达式整型表达式2 ;v其中:其中:数据类型表示要申请何种数据类型的存储空间数据类型表示要申请何种数据类型的存储空间整型表达式表示每一维数组的长度整型表达式表示每一维数组的长度v功能:功能:动态为一维或多维数组申请存储空间动态为一维或多维数组申请存储空间如果申请分配成功,返回数组的指针,失败则返回空指如果申请分配成功,返回数组的指针,失败则返回空指针针null。计算机技术基础系列课程课件计算机技术基础系列课程课件8 释放
12、动态分配存储空间释放动态分配存储空间v一般语法形式一般语法形式delete 指针;指针;v功能:功能:用于释放动态申请的数组存储空间用于释放动态申请的数组存储空间计算机技术基础系列课程课件计算机技术基础系列课程课件#includeusing namespace std;void main()int*a,i,n;coutn;a=new int n;for(i=0;in;i+)cout请输入请输入1班班i+1ai;coutendl;for(i=0;in;i+)cout1班班i+1号同学的成绩是:号同学的成绩是:;coutaiendl;coutendl;delete a;计算机技术基础系列课程课件计
13、算机技术基础系列课程课件自定义数据类型自定义数据类型计算机技术基础系列课程课件计算机技术基础系列课程课件9 结构体结构体v结构体是由不同数据类型的数据组成的集合体结构体是由不同数据类型的数据组成的集合体v结构体声明语句的语法形式:结构体声明语句的语法形式:struct 结构名结构名数据类型说明符数据类型说明符1 成员名成员名1;数据类型说明符数据类型说明符2 成员名成员名2;数据类型说明符数据类型说明符 n 成员名成员名n;v结构体类型变量声明的语法形式:结构体类型变量声明的语法形式:结构名结构名 结构变量名;结构变量名;v结构成员的引用形式:结构成员的引用形式:结构变量名成员名结构变量名成员
14、名计算机技术基础系列课程课件计算机技术基础系列课程课件例:例:#include using namespace std;struct student int num;char name20;int age;void main()student stu1=1,zhang san,18,stu2;stu2.num=2;stu2.age=20;coutstu1.num stu1.nameendl;coutstu2.num stu2.ageendl;计算机技术基础系列课程课件计算机技术基础系列课程课件#include using namespace std;struct student int num
15、;char name20;int age;void main()student stu5=1,zhang san,18;stu1.num=2;stu1.age=20;coutstu0.num stu0.nameendl;coutstu1.num stu1.ageendl;10 结构体数组结构体数组计算机技术基础系列课程课件计算机技术基础系列课程课件11 函数函数计算机技术基础系列课程课件计算机技术基础系列课程课件函数的定义函数的定义v函数定义的语法形式函数定义的语法形式类型标识符类型标识符 函数名(形式参数表)函数名(形式参数表)语句序列语句序列v函数的类型和返回值函数的类型和返回值函数的类型
16、函数的类型-类型标识符规定了函数的类型,也就类型标识符规定了函数的类型,也就是函数的返回值的数据类型是函数的返回值的数据类型函数的返回值函数的返回值-是指需要返回给主调函数的处理结是指需要返回给主调函数的处理结果,由果,由return语句给出。如:语句给出。如:return 0;return y;等等无返回值的函数其类型标识符为无返回值的函数其类型标识符为void,不必写,不必写return语句语句v形式参数形式参数形式参数(简称形参)表的内容如下:形式参数(简称形参)表的内容如下:type1 name1,type2 name2,typen namen例如:例如:int x,int y,flo
17、at z,形参的作用:实现主调函数及被调函数之间的数据联系。形参的作用:实现主调函数及被调函数之间的数据联系。没有形参的函数在形参表的位置应写没有形参的函数在形参表的位置应写void函数在被调用前是静止的,被调用时才由主调函数将实函数在被调用前是静止的,被调用时才由主调函数将实际参数(简称实参)赋予形参,并执行该函数过程际参数(简称实参)赋予形参,并执行该函数过程计算机技术基础系列课程课件计算机技术基础系列课程课件函数的调用函数的调用v函数调用的语法形式函数调用的语法形式 函数名函数名 (实参列表)(实参列表)实参列表中应给出及函数形参个数相同、类型相符实参列表中应给出及函数形参个数相同、类型
18、相符的实参的实参(实参可以是:常量、变量和表达式)(实参可以是:常量、变量和表达式)例如例如:(:(3,x,5*a+b,)函数调用可以作为语句,这时函数可以没有返回值函数调用可以作为语句,这时函数可以没有返回值v函数调用的执行过程函数调用的执行过程main()调调 fun(a,2*b)结束结束保存返回地址保存返回地址进行参数传递进行参数传递恢复返回地址恢复返回地址带回计算结果带回计算结果 fun(int x,float y)返回返回计算机技术基础系列课程课件计算机技术基础系列课程课件12 函数的原型声明函数的原型声明v调用函数之前先要在主调函数中声明函数原型调用函数之前先要在主调函数中声明函数
19、原型v语法形式:语法形式:类型标识符类型标识符 函数名(形式参数表)函数名(形式参数表);v注意:注意:在函数调用之前对所调用的函数进行声明,指在函数调用之前对所调用的函数进行声明,指出该函数的返回值的类型以及形参的个数和类型,编出该函数的返回值的类型以及形参的个数和类型,编译器据此信息对函数调用进行语法检查,保证形参和译器据此信息对函数调用进行语法检查,保证形参和实参的个数和类型的一致性,保证返回值的使用正确实参的个数和类型的一致性,保证返回值的使用正确性。性。计算机技术基础系列课程课件计算机技术基础系列课程课件13 函数重载函数重载v函数重载函数重载两个以上的函数,取相同的函数名,但是形参
20、的两个以上的函数,取相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类个数或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数,型及个数的最佳匹配,自动确定调用哪一个函数,这就是函数的重载这就是函数的重载计算机技术基础系列课程课件计算机技术基础系列课程课件14 函数的参数传递函数的参数传递v值调用值调用值调用是指当发生函数调用时,给形参分配值调用是指当发生函数调用时,给形参分配内存空间,并用实参来初始化形参(直接将内存空间,并用实参来初始化形参(直接将实参的值传递给形参)。这一过程是参数值实参的值传递给形参)。这一过程是参数值的单向传递过程,一旦形参
21、获得了值便及实的单向传递过程,一旦形参获得了值便及实参脱离关系,此后无论形参发生了怎样的改参脱离关系,此后无论形参发生了怎样的改变,都不会影响到实参变,都不会影响到实参v引用调用引用调用引用调用可以使在子函数中对形参所做的更引用调用可以使在子函数中对形参所做的更改对主函数中的实参有效。改对主函数中的实参有效。计算机技术基础系列课程课件计算机技术基础系列课程课件值调用值调用#include using namespace std;int abc(int a)a=a*10;couta=aendl;return a;int abc(int a);void main()int a;a=5;abc(a)
22、;couta=aendl;计算机技术基础系列课程课件计算机技术基础系列课程课件引用调用引用调用#include using namespace std;int abc(int&a)a=a*10;couta=aendl;return a;int abc(int&a);void main()int a;a=5;abc(a);couta=aendl;计算机技术基础系列课程课件计算机技术基础系列课程课件#include#include using namespace std;using namespace std;int min(int a,int length)int min(int a,int l
23、ength)int i,m;int i,m;m=0;m=0;for(i=1;ilength;i+)for(i=1;ilength;i+)if(aiam)m=i;if(aiam)m=i;return m;return m;void main()void main()int array10=18,26,23,13,15,25,27,14,29,31,tag;int array10=18,26,23,13,15,25,27,14,29,31,tag;tag=min(array,10);tag=min(array,10);coutcout数组中最小的元素是:数组中最小的元素是:arraytagendl
24、;arraytagendl;*找出数组中找出数组中的最小元素。的最小元素。函数的参数为数组函数的参数为数组:计算机技术基础系列课程课件计算机技术基础系列课程课件#include#include using namespace std;using namespace std;int min(int int min(int*p,int length)p,int length)int i,m;int i,m;m=m=*p;p+;p;p+;for(i=1;ilength;i+,p+)for(i=1;ilength;i+,p+)if(if(*pm)m=pm)m=*p;p;return m;return
25、m;void main()void main()int array10=18,26,23,13,15,25,27,14,29,31,t;int array10=18,26,23,13,15,25,27,14,29,31,t;t=min(array,10);t=min(array,10);coutcout数组中最小的元素是:数组中最小的元素是:tendl;tendl;*找出数组中找出数组中的最小元素。的最小元素。函数的参数为指针函数的参数为指针:计算机技术基础系列课程课件计算机技术基础系列课程课件#include#include using namespace std;using namespa
26、ce std;intint*min(int min(int*p,int length)p,int length)int i,int i,*p1;p1;p1=p;p+;p1=p;p+;for(i=1;ilength;i+,p+)for(i=1;ilength;i+,p+)if(if(*pp*p1)p1=p;p1)p1=p;return p1;return p1;void main()void main()int array10=18,26,23,13,15,25,27,14,29,31,int array10=18,26,23,13,15,25,27,14,29,31,*t;t;t=min(ar
27、ray,10);t=min(array,10);coutcout数组中最小的元素是:数组中最小的元素是:*tendl;tendl;*找出数组中找出数组中的最小元素。的最小元素。函数的返回值为指针函数的返回值为指针:计算机技术基础系列课程课件计算机技术基础系列课程课件#include#include using namespace std;using namespace std;void change(int void change(int*&t)&t)int x=15;int x=15;t=&x;t=&x;coutt=tendl;coutt=tendl;void main()void main
28、()int int*p;p;change(p);change(p);coutp=pendl;coutp=pendl;函数的参数为指针变量的引用函数的参数为指针变量的引用:计算机技术基础系列课程课件计算机技术基础系列课程课件15 函数的递归调用函数的递归调用v一个函数直接或间接地调用该函一个函数直接或间接地调用该函数本身,便构成了函数的递归调数本身,便构成了函数的递归调用。前者称为直接递归调用,后用。前者称为直接递归调用,后者称为间接递归调用。者称为间接递归调用。什么叫递归什么叫递归调用?调用?计算机技术基础系列课程课件计算机技术基础系列课程课件例:求例:求 n!#include using n
29、amespace std;int fac(int n);void main()int nf;nf=fac(6);cout6!=nfendl;int fac(int n)if(n=1)return 1;else return n*fac(n-1);计算机技术基础系列课程课件计算机技术基础系列课程课件递归调用的执行过程递归调用的执行过程main()调用调用fac(3)返回返回fac(3)返回返回3*调用调用fac(2)3*2*1fac(1)返回返回1返回返回2*调用调用fac(1)2*1fac(2)计算机技术基础系列课程课件计算机技术基础系列课程课件16 C+系统函数系统函数v为了方便程序员编程,
30、为了方便程序员编程,Visual C+软件包提软件包提供了大量已预先编制好的函数,即系统函数供了大量已预先编制好的函数,即系统函数(又称库函数或标准函数),对于系统函数,(又称库函数或标准函数),对于系统函数,用户可以不用定义和声明而直接调用它们。用户可以不用定义和声明而直接调用它们。C+软件包将不同功能的系统函数的函数原软件包将不同功能的系统函数的函数原型分别写在不同的头文件中,这些头文件是型分别写在不同的头文件中,这些头文件是以以“.h”为文件名后缀的文件,在使用某一为文件名后缀的文件,在使用某一系统函数前,必须用系统函数前,必须用include 预处理指令给预处理指令给出该函数的原型所在
31、头文件的文件名。出该函数的原型所在头文件的文件名。计算机技术基础系列课程课件计算机技术基础系列课程课件例例:v函数名:函数名:sqrtv函数原型:函数原型:double sqrt(double x);v所需头文件:所需头文件:v功能和返回值:计算并返回功能和返回值:计算并返回x的平方根。的平方根。计算机技术基础系列课程课件计算机技术基础系列课程课件17 内联函数内联函数v内联函数内联函数内联函数不是在调用时发生控制转移,而是在编译内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用语句处时将函数体嵌入在每一个调用语句处v定义内联函数的语法形式定义内联函数的语法形式inline
32、 类型说明符类型说明符 被调函数名(含类型说明符的形参表)被调函数名(含类型说明符的形参表)v注意:注意:内联函数体内一般不能有循环语句和内联函数体内一般不能有循环语句和switch语句语句内联函数的定义必须出现在第一次被调用之前内联函数的定义必须出现在第一次被调用之前通常内联函数应该是比较简单的函数,结果简单、通常内联函数应该是比较简单的函数,结果简单、语句少语句少如果将一个复杂的函数定义为内联函数,会造成代如果将一个复杂的函数定义为内联函数,会造成代码膨胀,增大开销码膨胀,增大开销计算机技术基础系列课程课件计算机技术基础系列课程课件#include using namespace std;
33、void main()double x,y,z;coutxy;z=cube(x)-cube(y);coutz=zendl;inline double cube(double x)return x*x*x;例:计算例:计算33yxz46类类 和和 对对 象象计算机技术基础系列课程课件计算机技术基础系列课程课件4718 类的定义类的定义在在C+中声明类的一般形式为:中声明类的一般形式为:class 数据成员声明数据成员声明;成员函数声明成员函数声明;变量声明函数原型声明 类的定义包含两部分:类头和类体,类头由关键字类的定义包含两部分:类头和类体,类头由关键字class 及及其后面的类名构成;类体由
34、一对大括号包围起来,一般情况下,其后面的类名构成;类体由一对大括号包围起来,一般情况下,类定义后面接一个分号。类定义后面接一个分号。别忘了必须用分号结束!计算机技术基础系列课程课件计算机技术基础系列课程课件4819 关于访问权限关于访问权限公有(公有(public)成员:可以在类外访问。)成员:可以在类外访问。私有(私有(private)成员:只能被该类的成员函数访问。)成员:只能被该类的成员函数访问。保护(保护(protected)成员:只能被该类的成员函数或)成员:只能被该类的成员函数或派生类的成员函数访问。派生类的成员函数访问。v数据成员通常是私有的。数据成员通常是私有的。v成员函数通常
35、有一部分是公有的,一部分是私有成员函数通常有一部分是公有的,一部分是私有的。公有成员函数可在类外被访问,也称之为类的。公有成员函数可在类外被访问,也称之为类的接口。的接口。计算机技术基础系列课程课件计算机技术基础系列课程课件49类的定义类的定义class private:;protected:;public:;成员函数的实现方法既可以定义在类的内部也可以定义在类的外部!计算机技术基础系列课程课件计算机技术基础系列课程课件50类的数据成员类的数据成员数据成员的声明和定义数据成员的声明和定义v类的数据成员的声明方式同变量声明相同,数据成类的数据成员的声明方式同变量声明相同,数据成员可以是任意类型,
36、包括基本数据类型,例如整型、员可以是任意类型,包括基本数据类型,例如整型、字符,也可以包括复杂类型,例如结构、结构数组字符,也可以包括复杂类型,例如结构、结构数组和类类型。和类类型。v数据成员声明的一般形式:数据成员声明的一般形式:类型名类型名 对象名;对象名;v例如:例如:int x;缺省了访问权限定义,数据成员整型变量x为私有数据成员计算机技术基础系列课程课件计算机技术基础系列课程课件5120 类的成员函数类的成员函数成员函数的声明和定义成员函数的声明和定义v函数的原型声明要写在类的主体中,原型说明了函函数的原型声明要写在类的主体中,原型说明了函数的形参表和返回值类型。而函数的具体定义是写
37、数的形参表和返回值类型。而函数的具体定义是写在类定义之外的。及普通函数不同的是,定义函数在类定义之外的。及普通函数不同的是,定义函数时要指明类的具体名称。时要指明类的具体名称。v成员函数定义的一般形式:成员函数定义的一般形式:函数类型函数类型 类名类名:成员函数名成员函数名(形参表形参表)函数体函数体计算机技术基础系列课程课件计算机技术基础系列课程课件5221 对象对象v声明了数据类型声明了数据类型“类类”之后,就可以像定义之后,就可以像定义int、float等数据类型变量那样去建立类的变等数据类型变量那样去建立类的变量。只是将量。只是将“类类”类型的变量叫类类型的变量叫类对象对象,或,或类实
38、例(实体)。类实例(实体)。v这个所谓的这个所谓的“对象对象”是指将一组和使用该数是指将一组和使用该数据的一组操作或过程封装起来,形成独立的据的一组操作或过程封装起来,形成独立的实体。实体。v这样必须定义实体的变量。对类来说就是为这样必须定义实体的变量。对类来说就是为该类定义一个对象。该类定义一个对象。计算机技术基础系列课程课件计算机技术基础系列课程课件53v定义类对象称为类的实例化定义类对象称为类的实例化类对象定义的一般形式:类对象定义的一般形式:1、类名、类名 类对象名类对象名;例如:例如:Point a;2、类名、类名 类对象指针名类对象指针名;例如:例如:Point*p;注意:注意:p
39、=new Point;动态创建一个对象动态创建一个对象 p=&a;获取已定义对象的地址获取已定义对象的地址 delete p;动态创建的对象可在不需要时释放动态创建的对象可在不需要时释放计算机技术基础系列课程课件计算机技术基础系列课程课件5422 对象成员的引用对象成员的引用v数据成员数据成员对象名对象名.成员名成员名 或:对象指针名或:对象指针名-成员名成员名例:例:a.x a.y a.x a.y 或或 p-x p-yp-x p-yv成员函数成员函数对象名对象名.成员名(参数表)成员名(参数表)或:对象指针名或:对象指针名-成员名(参数表)成员名(参数表)例:例:a.a.setPoint(1
40、0,10)a.move(5,3)a.display()p-p-setPoint(5,6)p-p-move(2,5)p-p-display()55构造函数和析构函数构造函数和析构函数计算机技术基础系列课程课件计算机技术基础系列课程课件5623 构造函数构造函数 构造函数和析构函数都是构造函数和析构函数都是类的成员函数类的成员函数,但是他们是,但是他们是特殊的成员函数,不用调用便特殊的成员函数,不用调用便自动执行自动执行,而且这些,而且这些函数的函数的名字及类的名字有关名字及类的名字有关.问题提出:类的数据成员如何初始化?问题提出:类的数据成员如何初始化?类定义体中不能在定义时初始化数据成员类定义
41、体中不能在定义时初始化数据成员,数据成员数据成员的值是无定义的。的值是无定义的。C+C+提供了一个方法:利用类的构造函数来初始化类提供了一个方法:利用类的构造函数来初始化类的数据成员的数据成员.计算机技术基础系列课程课件计算机技术基础系列课程课件57构造函数构造函数n构造函数是类的一个构造函数是类的一个特殊成员函数特殊成员函数它及类同名它及类同名没有返回值(没有返回值(甚至连关键字甚至连关键字void也不能有也不能有)在创建类的对象时在创建类的对象时,编译器会自动调用类的编译器会自动调用类的“构造函数构造函数”n可以在构造函数中执行初始化成员变量可以在构造函数中执行初始化成员变量的操作的操作。
42、计算机技术基础系列课程课件计算机技术基础系列课程课件58构造函数的形式参数构造函数的形式参数Point ()x=0;y=0;/定义无参构造函数定义无参构造函数对应的类对象声明:对应的类对象声明:Point a;Point (int x1,int y1)x=x1;y=y1;/定义有参构造函数定义有参构造函数对应的类对象声明:对应的类对象声明:Point a(0,0);或:或:Point a(3,5);计算机技术基础系列课程课件计算机技术基础系列课程课件59构造函数的形式参数构造函数的形式参数Point (int x1=0,int y1=0)x=x1;y=y1;/定义带默认值的有参构造函数定义带默
43、认值的有参构造函数对应的类对象声明:对应的类对象声明:Point a();或:或:Point a(3,5);或:或:Point a(6);计算机技术基础系列课程课件计算机技术基础系列课程课件60 重载构造函数重载构造函数 构造函数可以象普通函数一样被重载构造函数可以象普通函数一样被重载,C+根据说根据说明中的参数个数和类型选择合适的构造函数明中的参数个数和类型选择合适的构造函数.例:在例:在Point类中重载构造函数类中重载构造函数 Point ()x=0;y=0;/定义构造函数定义构造函数 Point (int x1,int y1)x=x1;y=y1;/有参构造函数有参构造函数计算机技术基础
44、系列课程课件计算机技术基础系列课程课件61默认构造函数默认构造函数 如果一个类没有定义构造函数如果一个类没有定义构造函数,编译器会自动编译器会自动生成一个生成一个不带参数不带参数的构造函数,称为的构造函数,称为默认构造函默认构造函数数,在程序中定义一个对象而没有指明初始化时,在程序中定义一个对象而没有指明初始化时,编译器便编译器便按默认构造函数按默认构造函数来初始化该对象。来初始化该对象。class Pointpublic:Point().计算机技术基础系列课程课件计算机技术基础系列课程课件62 对象指针对象指针First point:(12,6)Second point:(5,12)void
45、 main()Point a(12,6),*p=new Point(5,12);cout“First point:”;a.dispoint();coutdispoint();delete p;执行结果如下:执行结果如下:注意注意:在动态创建对象时,要调用类的构造函数。:在动态创建对象时,要调用类的构造函数。计算机技术基础系列课程课件计算机技术基础系列课程课件6324 拷贝拷贝(初始化初始化)构造函数构造函数概念:概念:n拷贝构造函数是一种特殊的构造函数拷贝构造函数是一种特殊的构造函数n拷贝构造函数的形参为本类对象的引用拷贝构造函数的形参为本类对象的引用。作用:作用:n当使用同类型的对象初始化另
46、一个对象时,不当使用同类型的对象初始化另一个对象时,不能简单的将一个对象的数据成员直接拷贝给另一能简单的将一个对象的数据成员直接拷贝给另一个对象。为了达到对象整体复制的目的,需要定个对象。为了达到对象整体复制的目的,需要定义一个特殊的构造函数:拷贝构造函数义一个特殊的构造函数:拷贝构造函数。计算机技术基础系列课程课件计算机技术基础系列课程课件64拷贝构造函数声明形式为:拷贝构造函数声明形式为:class 类名类名public:类名(形参)类名(形参);/构造函数构造函数 类名(类名类名(类名&对象名)对象名);/拷贝构造函数拷贝构造函数 .;类名类名:类名(类名类名(类名&对象名)对象名)/拷
47、贝构造函数的实现拷贝构造函数的实现 函数体函数体 计算机技术基础系列课程课件计算机技术基础系列课程课件65需要注意:需要注意:拷贝构造函数是将已知对象的数据成员的值拷贝拷贝构造函数是将已知对象的数据成员的值拷贝给正在创建的同类的对象给正在创建的同类的对象拷贝构造函数只能有拷贝构造函数只能有一个一个参数,并且是对某个对参数,并且是对某个对象的引用象的引用每个类每个类必须有必须有一个拷贝初始化构造函数,若没有一个拷贝初始化构造函数,若没有显显 式说明,则系统会自动生成一个默认的拷贝初式说明,则系统会自动生成一个默认的拷贝初始化构造函数始化构造函数计算机技术基础系列课程课件计算机技术基础系列课程课件
48、6625 析构函数的引出析构函数的引出问题的提出:问题的提出:对象消失时应做一些扫尾工作?对象消失时应做一些扫尾工作?一个类的对象在生命期间分配了资源,这一个类的对象在生命期间分配了资源,这些些资源需要在对象不复存在以前被释放资源需要在对象不复存在以前被释放.(例如(例如,如果构造函数中动态分配了内存,这块内存在如果构造函数中动态分配了内存,这块内存在对象消失之前必须被释放对象消失之前必须被释放.)及构造函数对应的是析构函数及构造函数对应的是析构函数,当一个对象当一个对象消失时消失时,系统会自动调用类的析构函数。系统会自动调用类的析构函数。计算机技术基础系列课程课件计算机技术基础系列课程课件6
49、7析构函数析构函数l析构函数名字:符号析构函数名字:符号“”类名类名l析构函数没有参数析构函数没有参数l没有返回值没有返回值.l一个类中只可能定义一个析构函数,所以一个类中只可能定义一个析构函数,所以析析构函数不能重载。构函数不能重载。l析构函数在对象生命期结束时被编译器自动析构函数在对象生命期结束时被编译器自动调用。调用。计算机技术基础系列课程课件计算机技术基础系列课程课件68析构函数声明形式为:析构函数声明形式为:class 类名类名public:类名(形参)类名(形参);/构造函数构造函数 类名()类名();/析构函数析构函数 .;类名类名:类名()类名()/析构函数的实现析构函数的实现
50、 函数体函数体 计算机技术基础系列课程课件计算机技术基础系列课程课件69默认析构函数默认析构函数 如同默认构造函数一样,如果一个类没如同默认构造函数一样,如果一个类没有定义析构函数,有定义析构函数,编译器会自动生成一个默编译器会自动生成一个默认析构函数认析构函数,其格式如下其格式如下:()默认析构函数是一个空函数默认析构函数是一个空函数计算机技术基础系列课程课件计算机技术基础系列课程课件70析构函数的自动调用析构函数的自动调用 当对象超出其定义范围时(即释放该对象时),当对象超出其定义范围时(即释放该对象时),编译器自动调用析构函数。在以下情况下,析构函数编译器自动调用析构函数。在以下情况下,