1、单击以编辑,母版标题样式,单击以编辑母版文本样式,第二级,第三级,第四级,第五级,*,Visual C+,面向对象,与可视化程序设计,第,1,章 基础知识,高级编程技术 第二讲,#include,void main(),char str_greet=“Welcome!”;,coutstr_greetendl;,C+,简例,高级编程技术 第二讲,字,符型,(char),、整型,(int),和浮点型,(float,、,double),这些基本数据类型还可用,short,、,long,、,signed,和,unsigned,来修饰。,基本数据类型,高级编程技术 第二讲,需要注意的是:,C+,可以有布
2、尔型,(bool),,在计算机内,编译系统将,true,表示成整数,1,,,false,表示成整数,0,,因此也可把布尔型看成是一个整型。,无符号,(unsigned),和有符号,(signed),的区别在于数值最高位的含义。,有符号类型最高位是符号位,其余各位表示数值大小;,无符号类型的各个位都用来表示数值大小;,相同基本数据类型的,signed,和,unsigned,的数值范围是不同。,例如,无符号字符型值的范围为,0255,,有符号字符型值的范围为,-,128127,。,char,、,short,、,int,和,long,可统称为整型。默认时,,char,、,short,、,int,和,
3、long,本身是有符号,(signed),的。,定义,定义一个数组可按下列格式进行:,.,后面的常量表达式用于确定数组的维数和大小。,一般表示某维大小的常量表达式中不能包含变量,但可以包括常量和符号常量,其值必须是一个确定的整型数值,且数值大于,1,。,元素的引用,引用格式:,.,数组的赋值,数组中的元素既可以在数组定义的同时赋初值,也可以在定义后赋值。,例子:,int i,Array10;,Array2=30;,i=Array2;,int Array1020;,复合数据类型,数组,高级编程技术 第二讲,定义,结构体定义的格式为:,struct,;,;,.,;,结构变量名列表,;,结构体,定义
4、是以,关键字,struct,作为标志的,,应是一个有效的标识符。在结构体中的每个成员都必须通过,“,成员定义,”,来确定成员名及其类型,。,注意,:结构体的成员变量类型既可以是基本数据类型,也可以是其他合法的类型,。,struct STUDENT,PERSON one;,/,用,已定义的结构体类型声明成员,float,eng,phy,math,poli,;/,英,语、物理、数学和政治的成绩,;,复合数据类型,结构体,高级编程技术 第二讲,struct PERSON,char*name;,int age;,结构体变量的初始化和引用,结构体变量的初始化的一般形式是在变量后面加上:,=;,例如:,s
5、truct POINT,int x;,int y;,spot=20,40;/,依次使,spot,中的,x,为,20,y,为,40,或,struct POINT pt1=100,200;/,使,pt1,中的,x,为,100,y,为,200,struct POINT pt2=100;/,只是使,pt2,中的,x,为,100,当一个结构体变量定义之后,就可引用这个变量。使用时,遵循下列规则:,(1),只能引用结构体变量中的成员变量,使用格式:,.,(2),若成员本身又是一个结构体变量,引用时需要用多个成员运算符一级一级地找到要访问的成员。,例如:,struct STUDENT john;,john.
6、one.age=10;,复合数据类型,结构体,高级编程技术 第二讲,定义方式:,union,;,;,.,;,共用体变量名列表,;,/,注意最后的分号不要忘记。,共用体除了关键字,(union),不同外,其使用方法均与结构体相同。,复合数据类型,共用体,高级编程技术 第二讲,枚举类型是一系列有标识符的整型常量的集合,增加程序代码的可读性。,格式:,enum ,枚举变量,;,enum,是关键字,枚举常量表中的枚举常量名之间要用逗号分隔。默认时,系统为每一个枚举常量都对应一个整数,并从,0,开始,逐个增,1,。,例如:,enum Colors Black,Blue,Green=4,Cyan,Red=
7、8,Yellow,White one;,则各枚举常量对应的整数依次为,0,,,1,,,4,,,5,,,8,,,9,,,10,。,enum Colors My_color;,My_color=Black;,复合数据类型,枚举,高级编程技术 第二讲,使用关键字,typedef,可以将已有的类型名用新的类型名来代替,格式:,typedef ;,例子:,typedef int INTEGER;,Windows,头文件中定义的结构化的,Win32,数据类型,数据类型,意义,数据类型,意义,BITMAP,位图结构,MSG,窗口消息,LOGBRUSH,画刷结构,POINT,点结构,LOGFONT,字体结构,
8、RECT,矩形结构,LOGPEN,画笔结构,WNDCLASS,窗口类结构,复合数据类型,自定义类型,高级编程技术 第二讲,typedef struct tagMSG,HWND hwnd;,UNIT message;,WPARAM wParam;,LPARAM lParam;,DWORD time;,POINT pt;,MSG,除了用,C,语言的,#define,定义符号常量,外,,常量可以通过关键字,const,来定义,例如:,const int bufSize=1024;,注意:,const,类型的量一经定义就不能改变其值,因此需要定义时进行初始化。,定义指向常量的指针:,const dou
9、ble*pc;,整型常量,整型常量可以用十进制、八进制和十六进制来表示,。,20,,,024,,,0 x14,注意,:,(,1),整型常量中的长整型,(long),要以,L,或小写字母,l,作为结尾。,(2),整型常量中的无符号型,(unsigned),要以,U,或,u,作为结尾。,常量及其定义,高级编程技术 第二讲,浮点,型常量,浮点型常量即实数,它有十进制数或指数两种表示形式,。,例如:,3.1415926F 0.1f 0.0 3e1 1.0e-3 2.,字符,常量,字符常量是用单引号括起来的一个字符,。,A,s,(,空格,),C/C+,可以用一个,“,”,开头的字符来表示特殊含义的字符常
10、量,。,例如,:,n,代表,一,个回车换行,t,代表一个横向跳格,b,代表一个退格,常量及其定义,高级编程技术 第二讲,定义,定义变量是用下面的格式,:,;,初始化,程序,中常需要对一些变量预先设置初值,这一过程称为初始化。在,C/C+,中,可以在定义变量时同时使变量初始化。,C+,变量的初始化还有另外一种形式,它与,C,语言不同。例如:,int nX(1),nY(3);,表示,nX,和,nY,是整型变量,它们的初值分别为,1,和,3,。,变量,高级编程技术 第二讲,C+,中的保留字,常用匈牙利表示法前缀的类型及其说明,变量,高级编程技术 第二讲,指针和指针变量,指针变量定义,:,*,*,.;
11、是一个定义指针变量的说明符,指针变量前面都需这样的,“,*,”,标明。例如:,int,*pInt1,*pInt2;/pInt1,pInt2,是指向整型变量的指针,&,和,*,运算符,&(,取地址运算符,),、,*,(,取值运算符,),运算符,“,&”,只能对变量操作,作用是取该变量的地址。,运算符,“,*,”,用于指针类型的变量操作,作用是取该指针所指内存单元中存储的内容。,指针和引用,高级编程技术 第二讲,初始化,例子:,int Stu_No=6002;,int*ipStu_No=,*ipStu_No=6006;,字符串指,针,字,符串常量的类型是一指向该字符串中第一个字符的字
12、符,指针,char,*,stExample,=The example of string!;,引用类型,T&,标示符,=,左,值表达,式,例,子:,int value;,int&Valuel=value,;,/,合法定义引用类型,声明,Valuel,是,对整数的引用,初始化为引用,value,int&Value2,;,/,非法定义引用类型,指针和引用,高级编程技术 第二讲,指针是一个复杂的概念,它能够指向(保存)不同类型变量的内存地址。例如:,int*pi;/pi,是指向,int,的指针,int*pc;/pc,是指向,int,指针的指针,int*pA10;/pA,是指向,int,的指针数组,i
13、nt(*f)(int,char);/f,是指向具有两个参数的函数的指针,int*f(int)/f,是一个函数,返回一个指向,int,的指针,指针和引用,高级编程技术 第二讲,条件语句,格式,:,if,()else,if ()elseif,语句,1?,语句,2:,语句,3,if(ab),x=a;,else,x=b;,相当于,x=(ab)?a:b,基本语句,条件语句,高级编程技术 第二讲,开关语句,开关语句,switch,能很好地解决嵌套太多这种问题,它具有下列形式:,switch (),case ,:,语句,1,case ,:,语句,2,.,case ,:,语句,n,default,:语句,n+
14、1,当表达式的值与,case,中某个表达式的值相等时,就执行该,case,中“:”号后面的所有语句。若,case,中所有表达式的值都不等于表达式的值,则执行,default:,后面的语句,若,default,不存在,则跳出,switch,结构。,基本语句,开关语句,高级编程技术 第二讲,#include,void main(void),int a;,couta;,switch(a),case,1:cout Mondayendl;,case,2:coutTuesdayendl;,case,3:coutWednesdayendl;,case,4:coutThursdayendl;,case,5:c
15、outFridayendl;,case,6:coutSaturdayendl;,case,7:coutSundayendl;,default:couterrorendl;,基本语句,开关语句,高级编程技术 第二讲,while,循环语句,语句,格,式:,while(),是循环体,可以是一条语句,也可以是复合语句。当表达式为非,0,时便开始执行,while,循环体中的语句,然后反复执行,每次执行都会判断表达式是否为非,0,,若等于,0,,则终止循环。,注意,:,循环体中应有使循环趋向结束的语句。,do,.while,循环语句,语句,格,式:,do ,while(),当,语句执行到,while,时,
16、将判断表达式是否为非,0,值,若是,则继续执行循环体,直到下一次表达式等于,0,为止。,基本语句,循环语句,高级编程技术 第二讲,for,循环语句,语句格式:,for(,表达式,1,;,表达式,2,;,表达式,3),一般情况下,,表达式,1,用作循环变量的初始化,,表达式,2,是循环体的判断条件,当等于非,0,时,开始执行循环体,再计算,表达式,3,,再判断表达式,2,的值是否为非,0,,若是,再执行循环体,再计算表达式,3,,如此反复,直到表达式,2,等于,0,为止。,基本语句,循环语句,高级编程技术 第二讲,k=1;s=0;,while(k=100),s=s+k;,k=k+1;,k=1;s
17、0;,do,s=s+k;,k=k+1;,while(k=100),s=0;,for(k=1;k=100;k+),s=s+k;,基本语句,循环语句,高级编程技术 第二讲,示例:,1,到,100,求和,转移语句使函数内的程序无条件地改变控制权,即在程序间进行控制转移,格式,如下:,break,;,用,于强制退出循环语句以及,case,语句的执行。当程序遇到这一语句后,,将,直接执行循环体后面的语,句,。,可以,从一个循环体跳出,也可以跳出,switch,结构。,continue,;,语,句仅仅使当前进行的这一次最内层的循环中止,程序流程转去执行对,真值,条件的计算,.,如果这时循环的真值条件为真
18、则开始下一次循环,如果为假则中,止循,环,.,contmue,语句与,break,语句不同,它并不中止整个循环的进行,而仅仅中止当前这,一次,循环的运行,.,goto;,用于跳出循环和,switch,语句。但是大量使用,goto,语句容易使程序流程无规律,降低程序的可读性,一般,goto,用在两方面:,1.,与,if,语句一起构成循环语句,,2.,从循环体中跳转到循环体外,尤其是多层嵌套循环。,基本语句,转移语句,高级编程技术 第二讲,for(i=0;i3),/,跳出循环,执行,cout,输出语句,break,;,coutbreakendl;,基本语句,转移语句,高级编程技术 第二讲,for
19、i=0;i3),/,继续执行循环动作,continue;,couti=i endl;,#include,void main(),int,i=1,Sum=0;,Loop:if(i=20),/,跳转标号,Sum+=i;,i+;,goto,Loop;/,跳转到,Loop,标识的那一行,/,输出结果,cout the summary of 120tSumendl;,上面的程序执行结果为,:,the summary of 120 210,基本语句,转移语句,高级编程技术 第二讲,定义格式,定义的格式如下:,类型标识符,函数名,(,形式参数表,),函数名后面必须跟一对圆括号“,(),”,以区别变量名及其
20、他用户定义的标识名。形参写在括号内,参数可以是,0,,,一个或多个,多个参数间要用逗号分隔。,函数的函数体由在一对花括号中的若干条语句组成,用于实现这个函数执行的动作。不允许在一个函数体中再定义函数。,函数,高级编程技术 第二讲,声明,声明函数格式:,类,型标识符,函数名,(,形式参数表,);,形,参的变量名可以省略。但注意,函数声明的内容应和函数的定义应相同。,调用,调用格式为:,();,实,参与形参相对应,是实际调用函数时所给定的常量、变量或表达式,必须有确定的值,。,函数,高级编程技术 第二讲,面向对象程序设计,面对的是一个个对象。其中每一组数据都是有特定的用途的,是某种操作的对象。也就
21、是说,一组操作调用一组数据。,程序设计者的任务包括:一是设计所需的各种类和对象,即决定把哪些数据和操作封装在一起;二是考虑怎样向有关对象发送消息,以完成所需的任务。,对一个大型任务来说,面向对象程序设计方法是十分有效的,它能大大降低程序设计人员的工作难度,减少出错机会。,面向对象程序设计的特点,高级编程技术 第二讲,面向对象的程序设计是以类和对象为基础的,程序的操作是围绕对象进行的,在此基础上利用了继承机制和多态性等。,面向过程的结构化程序设计中,常用以下公式来表述程序:,程序=算法数据结构,面向对象程序设计就是把一个算法和一组数据结构封装在一个对象中。因此就形成了新的观念:,对象=算法 数据
22、结构,程序=(对象+对象+对象+,)+消息,或:程序=对象,s+,消息,面向对象程序设计的特点,高级编程技术 第二讲,面向对象程序设计的特点,高级编程技术 第二讲,一般,C+,类的文件组织形式,一个类组织在两个文件中,文件名与类名相同,类的声明文件以,.hpp,或,.h,为后缀,类成员函数的定义常放在与类同名的,.cpp,文件中,比如:,Complex.hppComplex.cpp,引用其他类,用,#include,指令包含类的声明,比如:,#include,“,complex.hpp,”,面向对象程序设计的特点,高级编程技术 第二讲,student.cpp,Program.exe,stude
23、nt.obj,student.h,Other1.cpp,Other1.obj,Other2.cpp,Other2.obj,#include,compile,link,应用,C+,类的文件组织形式,案例:,clock,类的封装,面向对象程序设计的特点,高级编程技术 第二讲,面向对象程序设计的特点,高级编程技术 第二讲,封装的意义,封装使类成为一个具有内部数据的自我隐藏能力、功能独立的软件模块。,用,private,把不想让其他程序访问的数据或函数设置为私有成员,就可以禁止其他程序对这些数据的随意修改;用,public,设置一些公有成员,让本类之外的其他函数能够通过这些公有成员,按照类允许的方法访
24、问类的私有数据,就能够实现数据保护的目的,类的定义格式一般分为,说明部分,和,实现部分,。说明部分:是用来,说明,类中的成员,包含,数据成员,的说明和,成员函数,的说明。成员函数是用来对数据成员进行操作的,也称为“,方法,”。实现部分:是用来对成员函数进行,定义,。,说明部分,的一般格式为:,class,类类型名,private:,私有成员说明,public:,公有成员说明,;,程序中的任何函数都可访问,私有访问权限,为默认值,可缺省,除本类中的成员函数及友元外,其他类外函数不能访问。,公有访问权限,类的定义格式,高级编程技术 第二讲,class,private:,私有数据和函数,public
25、公有数据和函数,protected:,受保护数据和函数,;,其中,class,是关键字。,是用户自定义的,C+,标识符,,Visual C+,中类名的风格是所有类的名字都以大写字母,C,开头,表示这是个类的名字,例如,CBook,、,CStudent,等。,被花括号围起来的部分称做类体。,用于类的继承,可以被派生类的成员函数访问,类的说明,高级编程技术 第二讲,例如:定义一个,person,类,设,person,具有的特征:属性(姓名、年龄、性别),方法(输出一个人的属性);则对应着有4个成员:,三个数据成员,,,一个成员函数,。这些数据成员一般不能由外界直接访问,随意修改。而只能通过成员
26、函数进行访问。所以三个数据成员定义为,私有成员,,,print,成员函数定义为,公有成员,。则有:,class Cperson,private:,char name10;,int age;,char sex;,public:,void print();,;,成员函数的说明形式与一般函数的说明形式一致,数据成员的说明形式与变量的定义形式相似,类名通常用,C,字母开始,以区别其他标识符,类的说明,高级编程技术 第二讲,例,描述图书类。,class CBook,private:,char*m_pczName;,intm_nPages;,intm_nEdition;,public:,voidGetBo
27、okName(char*pName);,intGetTotalPages();,intGetBookEdition();,private:,voidSetBookName(char*pName);,voidSetTotalPages(int nPages);,voidSetBookEdition(int nEdition);,public:,CBook();,;,class CPoint,private:,int m_x;,int m_y;,public:,voidSetXY(int x,int y);,intGetX();,intGetY();,;,类的说明,高级编程技术 第二讲,例,定义描
28、述平面上点的类,要求提供成员函数设置点的坐标值、返回点的横纵坐标值等功能。,类的实现部分,即定义它的成员函数,方式与定义普通函数大体相同。,若在类说明外部定义成员函数,则应使用,作用域限定符,:,指明该函数是哪个类中的成员函数。,格式为:,类型,类名:,成员函数名(参数表)函数体,如:,void Cperson:print(),coutnameagesex endl;,除特殊指明外,成员函数操作的是,同一对象,中的数据成员。其中如,name,等。,若在成员函数中调用非成员函数(没有类名的函数;全局函数),则可用,不带类名的:,来表示。,类的定义,高级编程技术 第二讲,1.,成员函数的定义,类说
29、明声明了类的内部结构(数据成员),以及类的接口(成员函数的函数原型),类定义给出这些函数功能的具体实现。,成员函数的定义格式如下:,:,(,),定义,CPoint,类的成员函数的实现,void CPoint:SetXY(int x,int y),m_x=x;,m_y=y;,int CPoint:GetX(),return m_x;,int CPoint:GetY(),return m_y;,函数,SetXY,(,int x,int y,)是用所提供的函数参数,x,和,y,的值去设置,CPoint,类某个对象的,m_x,和,m_y,值。,而其他两个函数的实现仅仅是将任何一个,CPoint,类对象
30、所具有的坐标值返回。,类的定义,高级编程技术 第二讲,与普通函数一样,成员函数参数可以被指定缺省值,当调用该成员函数时,如果没有显式指明参数,则按照相应的语法规则用参数缺省值作为参数调用该成员函数。,class CPoint,voidSetXY(int x=0,int y=0);,;,class CPoint,voidSetXY(int x,int y);,voidSetXY(int x);,voidSetXY(int y);,;,3,重载成员函数,void CPoint:SetXY(int x,int y),m_x=x;,m_y=y;,void CPoint:SetXY(int x),m_x
31、x;,类的定义,高级编程技术 第二讲,2.,带缺省参数的成员函数,c1ass My_student,class boy/,嵌入类,boy,,作为类,My_student,的成员之一,char boy_name20;,int boy_age;,my_boy_student;,c1ass girl/,嵌入类,girl,,作为类,My_ student,的成员之一,char girl_name20;,int girl_age;,my_girl_student;,public:,void student_input(void);,void student_output(void);,类的定义,高级编
32、程技术 第二讲,4.,类的嵌套定义,例:,CPoint point1,point2,*pPoint;,从类产生对象的过程是一个从一般到特殊的演绎过程,这个过程在,C+,中有相对应的语法,对象声明。声明对象像声明一个普通变量一样,只不过这里将类看做是类型(抽象类型),具有该类型的变量称为对象。具体格式如下:,;,程序运行遇到这条语句时,将首先根据,point1,和,point2,所属类,CPoint,计算对象所需存储空间的大小,然后为,point1,和,point2,分配存储空间,并将相应的空间以,point1,和,point2,作为标识。,与利用,new,运算符创建动态数据对象一样,利用,ne
33、w,运算符也可以创建类的动态对象,例如创建,CPoint,类的动态对象可按如下方式编写程序:,CPoint*pPoint=new CPoint;,对象实例,高级编程技术 第二讲,1.,通过对象引用对象成员,void main(),CPoint MyPoint1,MyPoint2;/,创建两对象,调用缺省构造函数初始化数据成员为,0,MyPoint1.SetXY(2,3);/,设置对象,MyPoint1,的属性值分别为,2,和,3,MyPoint2.SetXY(4,5);/,设置对象,MyPoint2,的属性值分别为,4,和,5,int x=MyPoint1.GetX();/,调用成员函数得到数
34、据成员,m_x,的值,并赋值给变量,x,int y=MyPoint1.GetY();/,调用成员函数得到数据成员,m_y,的值,并赋值给变量,y,coutx;yendl;,coutMyPoint2.GetX();MyPoint2.GetY()GetX();/x,的值将等于对象,MyPoint2,的属性,m_x,的值,CPoint*pPoint1=new CPoint;,pPoint1-SetXY(6,7);/,设置,pPoint1,所指对象的属性值,CPoint,x=refPoint.GetX();,使用成员选择符,.,引用对象成员,使用成员选择符,-,引,用对象成员,使用,“,引用,(,&,
35、引用,对象成员,对象成员的引用,高级编程技术 第二讲,2.,成员函数中引用对象成员,隐含成员引用的实现是通过将指向调用函数的对象的指针作为“隐藏”的第一个变元传递给成员函数的,这个指针被命名为,this,,根据,this,指针可以知道对象成员的地址。可以使用,this,指针直接引用对象成员:,引用对象成员需使用特定对象,再通过成员选择运算符来进行,但是对类的成员函数而言可以有简单的方式,即直接引用所属类各成员。例如,例,成员函数的定义中对,CPoint,类数据成员,m_x,和,m_y,的引用。对象成员的这种引用方式称为,隐含成员引用,,或,隐式对象的存取,。,对象成员的引用,高级编程技
36、术 第二讲,void CPoint:SetXY(int x,int y),this-m_x=x;,this-m_y=y;,CBook*CBook:GetBoolPtr(),return this;,CBook&CBook:GetBoolRef(),return*this;,示例,对象成员的引用,高级编程技术 第二讲,#include,#include,/,定义弧度和度之间的转换比例,const double ANG_TO_RAD=0.0174532925;,class angle/,定义类,angle,double value;/,类,angle,的私有成员变量,public:/,类,angl
37、e,的公共成员函数,void SetValue(double);,double GetSine(void);,deg;/,声明类,angle,的对象,deg,void angle:SetValue(double a),value=a;,/,类,angle,的成员函数,GetSine,double angle:GetSine(void),double temp;,temp=sin(ANG_ TO_RAD*value);,return temp;,void main(),/,给类,angle,的成员变量,value,赋值,deg.SetValue(60.0);,coutThe sine of th
38、e angle is:”;,/,输出正弦值,coutdeg.GetSine()endl;,这个程序的输出结果是,:,The sine of the angle is:0.866025,1、,在类体中不允许对所定义的数据成员进行初始化。,class TDate,public:,private:,int year(1998),month(4);,;,2、,类中的数据成员的类型可以为任意的。,3、,习惯将类的定义代码放到一个头文件中,以后若要使用则用文件包含命令包含。,错误,注意事项,高级编程技术 第二讲,程序中的对象也具有生命周期,当问题空间对象出现时,作为解的程序中的对象被创建,然后模拟环境或其
39、它对象对问题空间对象的影响,改变自身状态。问题空间对象消亡时,程序中的对象相应地中止运行,并释放所占据的存储空间,从而被删除。,C+,的对象将经历从创建、状态演化到删除的整个生命周期,对于对象生命周期的每个阶段,,C+,都提供相应语法供编程者控制对象行为。,生命周期,高级编程技术 第二讲,构造函数和析构函数是,在类体中说明,的两种特殊的成员函数。,构造函数,的功能是在创建对象时给对象,分配,内存空间,并可使用给定值来,初始化,对象。,析构函数,的功能是用来,释放,一个对象的已分配空间。并可在对象被清除前,完成一些,清理,工作。,构造函数与析构函数的功能正好是,对应,的。,构造函数和析构函数,高
40、级编程技术 第二讲,如:,class,CDate1,public:,CDate1(int y,int m,int d);,CDate1();,void Print();,private:,int year,month,day;,;,示例,:,构造函数的说明,析构函数的说明,一般成员函数的说明,函数名与类名一致,无类型但可有参数,名字与类名一致,前有,无类型无参数,构造函数和析构函数,高级编程技术 第二讲,CDate1:CDate1(int y,int m,int d),year=y;month=m;day=d;,coutConstructor called.n;,CDate1:CDate1()
41、coutDestructor called.n;,void CDate1:Print(),coutyear.month.dayendl;,构造函数的定义,析构函数的定义,一般函数的定义,与其他成员函数定义一样,两种函数的定义可放在类体内,也可放在类体外,构造函数和析构函数,高级编程技术 第二讲,class My_class,float a,b;,public:,/,带有默认参数的构造函数,My_class(float x=3.5,float y=8.5),a=x;,b=y;,;,构造函数 示例,构造函数和析构函数,高级编程技术 第二讲,My_class c1(2,4);,My_class c
42、2(4);,My_class c3;,class My_class,public:,/,没有参数的构造函数,My_class(),coutNO PARAMETER endl;,;,构造函数 示例,构造函数和析构函数,高级编程技术 第二讲,class special_class,int i;,public:,special_class(int x=1);,;,void main(),special_class cl(10);/,正确,使用,cl:special_class(in t),构造函数,special_class c2;/,错误,无法精确调用构造函数,析构函数 示例,构造函数和析构函数,
43、高级编程技术 第二讲,class My_class,char,*,str;,int MaxLen;,public:,My_class(char*)/,定义类,My_class,的构造函数,str=new charMaxLen;,My_class()/,构造类,My_c1ass,的析构函数,coutHere delete the strendl;,delete str;,void GetString(char*);,;,构造函数是一种特殊的成员函数,在创建对象时自动调用的,常用于完成对象创建时对数据成员的初始化。,形式上,构造函数,名字与类名相同,,而且,没有返回值,(类型),即使是,void,
44、类型也是非法的,只要满足了这两个条件,原则上可以定义任何形式的构造函数,因此,构造函数是可以重载的,。,C+,中有两种特殊的构造函数,缺省构造函数,和,拷贝构造函数,,如果类中未定义这两种构造函数,必要时,C+,编译器,自动生成,,但自动生成的构造函数有时会引起运行错误。,对象的创建与构造函数,高级编程技术 第二讲,缺省构造函数,的形式为无参数的构造函数,如果编程者未定义这样的构造函数,编译器会自动生成。,自动生成的缺省构造函数将调用父类及对象成员的构造函数进行初始化。,注意:,如果类中定义有常量,必须由编程者提供与缺省构造函数相应的构造函数。,对象的创建与构造函数,高级编程技术 第二讲,拷贝
45、构造函数,用于创建一个与已知对象具有相同属性值的对象。,当进行对象赋值、对象作形参的形实结合、函数返回一个对象时都会自动调用相应类的拷贝构造函数。拷贝构造函数的格式是固定的,具体格式如下:,:(const,注意:如果类中具有指针类型数据成员,通常需要编程者提供自己的拷贝拷贝构造函数,对象的创建与构造函数,高级编程技术 第二讲,析构函数,对象消亡前所调用的最后一个函数。通常用于对象消亡时执行一些清理任务,例如,将对象中保存的一些动态分配的空间释放给操作系统,对象的消亡与析构函数,高级编程技术 第二讲,构造描述学生自然情况的类,学生的属性有名字、年龄、性别等,该类提供必要的构造函数和析构函数,#i
46、nclude string.h,#include iostream.h,enum SEX male,female,unknow;,class CStudent,private:,char*m_pczName;,intm_nAge;,SEXm_sSex;,public:,CStudent(char*pName,int nAge,SEX s);,CStudent(char*pName);,CStudent();,;,CStudent:CStudent(char*pName),coutOBJECT CREATE:pNameendl;,m_pczName=new charstrlen(pName)+1
47、if(m_pczName!=0),strcpy(m_pczName,pName);,m_nAge=-1;/-1,表示尚未初始化该属性,m_sSex=unknow;,示例,高级编程技术 第二讲,CStudent:CStudent(char*pName,int nAge,SEX s),coutOBJECT CREATE:pNameendl;,m_pczName=new charstrlen(pName)+1;,if(m_pczName!=0),strcpy(m_pczName,pName);,m_nAge=nAge;,m_sSex=s;,CStudent:CStudent(),coutOBJE
48、CT DELETE:m_pczNameendl;,delete m_pczName;,void main(),CStudent s1(John,10,male);,CStudent*ps=new CStudent(Jane,10,female);,delete ps;,示例,高级编程技术 第二讲,构造函数,的,特点,有:,程序中不能直接调用构造函数,在创建对象时,系统自动调用,构造函数。,构造函数,可以重载,,即可定义多个参数个数不同的函数,构造函数有,隐含的返回值,,并由系统内部使用,析构函数,的,特点,有:,一个类中只能定义一个析构函数,即,不能重载,析构函数可以被调用,也可系统调用,被自
49、动调用的情况有两种:,在一个函数体内定义的一个对象,当,函数结束,时,用,new,运算符动态创建的一个对象,在,使用,delete,释放,时,示例,高级编程技术 第二讲,内联函数和外联函数,成员函数的重载性,设置参数的缺省值,成员函数的特性,高级编程技术 第二讲,内联函数:指定义在类体内的成员函数,。,外联函数:指说明在类体内,定义在类体外的成员函数。,类外定义的函数,缺省,情况下都是外联函数,用关键字,inline,可以强制转换。,对于内联函数,不是在调用时才转去执行函数体,而是在编译时对所有调用该函数的地方,装入实际的函数代码,。节省了调用开销,提高了运行速度。内联函数必须在调用之前进行定
50、义。,内联函数和外联函数,高级编程技术 第二讲,当成员函数的规模较小时,语句只有1,-5,行,符合内联函数条件,则可,在类中定义成员函数,,,成为内联成员函数,。,如:,class TDate,public:,void Set(int m,int d,int y)/,置日期值,month=m;day=d;year=y;,void Print();/,打印输出,private:,int month;,int day;,int year;,;,由于类名是成员函数名的一部分,所以一个类的成员函数与另一个类的成员函数可同名,若将内联成员函数定义在类说明之外则要加上,inline。,内联成员函数,内联函






