资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,C+,类与对象,指针,继承与派生,类成员的进一步使用,多态性与虚函数,重载,类与对象,类的定义格式,在类中要指定成员的访问权限,没有标明(默认)访问权限的成员为私有成员。,在类内说明访问控制属性的先后顺序没有规定。,在类体内进行数据成员定义时,不允许对数据成员进行赋值。,当在类体外定义函数时,在类体内应由函数原型说明。,类中的成员不能使用,auto,、,extern,、,register,等关键字进行修饰。,其他类的对象可以作类的成员,但自身类的对象不允许作该类成员。,通常将类的定义部分存放在一个用户自定义的头文件中,可方便以后使用。,/,说明部分,Class,public:,private:,protected:,;,/,实现部分,类与对象,类的成员函数,在所定义的成员函数名之前应缀上类名,类名与函数名之间是作用域运算符“:”。,在定义成员函数时,对带参数的函数,要给出参数的类型和参数名。而类内对应的该函数原型的形参可以只有类型,不写参数名。,函数的返回类型、形式参数的类型与类体内对应函数原型说明的类型要匹配。,当在类体外定义的成员函数较为短小,可以定义为内联函数的形式,在定义时最前面用关键字,inline,修饰。,类与对象,类成员的访问控制,公有类型定义了类的外部接口,对类来讲,任何来自外部的访问都要通过外部接口来进行。,私有成员不允许外部程序代码直接访问,这样,私有成员就被隐藏在类中。,保护类型同私有类型的差别是在类的继承和派生是对派生类的影响不同。,类与对象,对象的声明与使用,;,point p1,p2,p,.,.,#include,class,Tpoint,private:,int,X,Y;,public:,void,point(int,x,int,y);,int,getX()return,X;,int,getY()return,Y;,void,Move(int,int,);,;,void,Tpoint:point(int,x,int,y),X=x;,Y=y;,void,Tpoint:Move(int,xset,int,yset,),X+=,xset,;,Y+=,yset,;,void main(),Tpoint,D1,D2;,D1.point(10,12);,D2.point(7,12);,D1.Move(4,5);,D2.Move(-2,1);,cout,“x1=”D1.getX()”y1=”D1.getY(),endl,;,cout,“x2=”D2.getX()”y2=”D2.getY(),endl,;,X1=14,y1=17,X2=5,y2=13,类与对象,构造函数,C+,语言在创建一个对象时,通过系统自动调用构造函数对所创建的对象进行初始化。,对象(数据成员)的初值通过自动调用构造函数取得,可以通过赋值或调用已有的成员函数来改变它。,注意事项,该函数的名字与类名相同,构造函数无返回值,因此不允许定义构造函数的返回值类型,其中包括,void,类型。,该函数可以有一个或多个参数,也可以无参数,无参数的构造函数称为默认构造函数。,该函数通常在创建对象时系统自动调用。如果类内没有定义构造函数,系统会自动定义默认的构造函数。,一个类可以有一个以上的构造函数,重载构造函数由其参数个数、类型和排列顺序区分。,#include,class set,int,elems100;,int,size;,int,card;,public:,set(int,i=16),size=I;,if(size16)size=100;,if(size16)size=20;,cout,“size=”size,endl,;,;,void main(),set s1(64),s2(8),s3;,class point,int,x,y,;,public:,point(int,m=0,int n=0),x=m;,y=n;,/,;,void main(),point p1;,point p2(10);,point p3(10,10);,/,class sub,/,public:,sub();,sub(int,i=30);,sub(int,int,);,sub(float,float,);,/,;,void main(),sub ob1(10,10);,sub ob2(3.2,3.4);,sub ob3;/,二义,/,类与对象,拷贝构造函数,在初始化时调用,以便将一个已知对象的数据成员的值赋值给正在创建的另外一个同类的对象。,只有一个参数,并且是对某一个对象的引用,(,&,),#include,class point,private:,int,X,Y;,public:,point(int,xx=0,int,yy,=0),X=xx;,Y=,yy,;,point(point,int,getX()return,X;,int,getY()return,Y;,point:point(point,&p),X=,p.X,;,Y=,p.Y,;,void,main(void,),point A(11,22);,point B(A);,cout,B.getX,(),endl,;,void,f(point,p),cout,p.getY,(),endl,;,void main(),point A(22,23);,f(A,);,void g(),point A(55,66);,return A;,void main(),out,g().getX,(),endl,;,类与对象,析构函数,析构函数的功能是用来释放所创建的对象,主要用来完成对象被删除前的一些清理工作。,析构函数的名字与类名相同,与构造函数的区别是名字前面加一个符号“,”,,表明它与构造函数的功能相反。析构函数也没有函数返回类型。,#include,class demo,private:,int,m;,int,n;,public:,demo(int,x,int,y),m=x;,n=y;,cout,“constructor function is called here,”m“,”n,endl,;,demo(),cout,“Destructor function is called here,”m“,”n,endl,;,;,void main(),demo A(3,5);,for(,int,i=1;i3;i+),demo,B(i,*3,i*4);,cout,“,程序执行完毕!,”,endl,;,Constructor function is called here,3,5,Constructor function is called here,3,4,Destructor function is called here,3,4,Constructor function is called here,6,8,Destructor function is called here,6,8,程序执行完毕!,Destructor function is called here,3,5,类与对象,对象的生存期,全局对象,全局对象是被定义在一个文件中,而它的作用域是在包含该文件的整个程序中。其缺点是安全性较差,因为在整个程序的各个文件中都可以改变它。,全局对象定义在函数体外,定义时不加修饰符。在某个文件中定义的全局对象,在其他文件中引用前应该说明,在说明时,要在前面加修饰字符,extern,。,局部对象,静态对象,内部静态对象,定义在函数体或程序块内的静态对象称为内部静态对象,它的作用域为定义它的函数体或程序块内,与局部对象相同;,外部静态对象,定义在函数体外的静态对象称为外部静态对象,它的作用域是从定义时起直到该文件结束。,外部静态对象的作用域是文件级的,而全局对象的作用域是程序级的,静态对象,存在内存的静态工作区。,static,(,),类与对象,类的作用域,类的作用域是介于文件域和函数域之间的作用域。,类作用域中定义的数据成员不能使用,register,、,extern,等修饰,类中定义的成员函数也不能用,extern,修饰。,类的成员函数内出现了该类的其他成员,该成员函数具有类的作用域;,使用类域作用符限定的成员具有类作用域;,在引用对象的成员时,该成员具有类作用域。,对于生存期相同的对象,先创建的对象后释放,后创建的对象先释放。,#include,class demo,private:,int,m;,int,n;,public:,demo(int,x,int,y),m=x;,n=y;,cout,“,构造函数被调用,m=”m“,n=”n,endl,;,demo();,void print();,;,void,demo:print,(),cout,“,成员函数,print(),被调用:,m,=”m“,n=”n,endl,;,demo:demo,(),cout,“,析构函数被调用,m,=”m“,n=”n,endl,;,void function1(),demo D1(1,1);,static demo D2(2,2);,cout,“,在函数,function1(),中调用!,n,”;,demo D3(3,3);,static demo D4(4,4);,void main(),demo D5(5,5);,cout,“,在,main(),函数中,调用函数,function1(),之前!,”,endl,;,function1();,cout,“,在,main(),函数中,调用函数,function1(),之后!,”,m=3,n=3,构造函数被调用,-m=4,n=4,构造函数被调用,-m=5,n=5,在,main(),函数中,调用函数,function1(),之前!,构造函数被调用,-m=1,n=1,构造函数被调用,-m=2,n=2,构造函数被调用,-m=5,n=5,在函数,function1(),中调用!,析造函数被调用,-m=1,n=1,在,main(),函数中,调用函数,function1(),之后!,成员函数,print(),被调用:,m=5,n=5,析造函数被调用,-m=5,n=5,析造函数被调用,-m=2,n=2,析造函数被调用,-m=4,n=4,析造函数被调用,-m=3,n=3,指针,对象指针和,this,指针,对象数组和对象指针数组,对象引用,堆对象,Const,特性,渐增式软件开发,类组合,指针,对象指针的说明和使用,*,*,-,-(),或,(*).,(*).(),#include,using namespace std;,class Ch42class,int,n;,public:,Ch42class(int,x)n,=x;,Ch42class()n=0;,void copy(Ch42class*,ch,),n=,ch,-n;,void print(),cout,“n=”nprint();,n=5,N=2,指针,this,指针,this,指针是由系统在编译时自动产生一个指向对象自身的指针,当对象调用一个成员函数时,会把,this,指针作为一个隐含参数传递给成员函数。成员函数接收到该指针后,就可以利用该指针来回访对象的数据成员。,This,指针是属于对象的,它的类型与对象的类型是一致的。,This,指针通常供系统用于判断成员函数所使用的到底是哪一个数据成员副本。但是,当需要在一个成员函数内标识被该成员函数操作的对象时,就需要显示使用,this,指针。,#include,using namespace std;,class Ch44class,int,n;,public:,Ch44class(int,x)n,=x;,Ch44class()n=0;,void copy(ch44Class*,ch,),if(this!=,ch,),this-n=,ch,-n;,void print(),cout,“n=”n,endl,;,Ch4
展开阅读全文