分享
分销 收藏 举报 申诉 / 117
播放页_导航下方通栏广告

类型C++面向对象程序设计教学PPT3.ppt

  • 上传人:xrp****65
  • 文档编号:13338616
  • 上传时间:2026-03-04
  • 格式:PPT
  • 页数:117
  • 大小:1.32MB
  • 下载积分:10 金币
  • 播放页_非在线预览资源立即下载上方广告
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    C++ 面向 对象 程序设计 教学 PPT3
    资源描述:
    单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第,3,章 类与,对象,本章主要介绍类与对象。,类,(,class,)是面向对象程序设计的核心,是实现数据封装和信息隐藏的工具,是继承和多态的基础。因此,本章是全书的基础与重点,也是学习面向对象程序设计技术的基础。学习者一定要掌握,类的概念,,类,成员访问控制,,构造函数与析构函数等重要概念。,3.1,结构与类,1,、,C,对,C,结构的扩展,最初的,C+,称为“带类的,C”,,它扩展了,C,语言结构的功能,结构不仅可以包含数据,而且还可以包含操作这些数据的函数。,【,例,3-1】,一个包含了数据和数据操作函数的复数结构。,/Eg3-1.cpp,struct,Complex,double r;,double i;,void,init(double,rr,double,ii)r,=,rr;i,=ii;,double real()return r;,double image()return i;,;,3.1,结构与类,成员类型,数据成员,:结构中的数据和函数称为成员。,r,、,i,是数据成员。,成员函数:,init,、,real,、,image,是函数成员。在,C+,中,函数成员常称为成员函数。,结构类型的应用,定义,Complex,结构后,就可以用它来,定义变量,,并能像,C,语言的,结构成员一样引用,它的成员函数。,void main(),Complex a;,a.init(2,3);,cout,a.real,(),+“,a.image,(),i“,endl,;,2026/3/4 周三,第3章,类和对象,4,1,、,信息:设置访问权限的原因隐藏,将数据和操作数据的函数包装在一起的主要目的是实现数据封装和信息隐藏,信息隐藏就是使结构中的数据和对数据进行操作的细节对外不可见。,2,、成员的访问控制,public,可以从结构(类)的外部(使用者)访问,抽象,定义类的接口,private,仅供结构(类)的内部(自身成员函数)访问,封装,信息隐藏,protected,供结构(类)的内部及后代访问,3.1.2,访问权限,3.1.2,访问权限,3,、增加了访问权限的,complex,类,#include,struct,Complex,private:,double r;,double i;,public:,void,init(double,rr,double,ii),r=,rr;i,=ii;,double real()return r;,double image()return i;,;,void main(),Complex a;,a.init(2,3);,cout,a.real,()+“,a.image,(),i,endl,;,a.r,=6;/,错误,a.i,=3.2;/,错误,1,、引入类的原因,解除,struct,的不安全性(,struct,成员的默认访问权限是,public),区别于,struct,2,、类的定义形式,class,类名,public:,公有成员说明;,protected:,保护成员说明;,private:,私有成员说明;,;,3.1.3,class,3,、,【,例,3-2】,用,class,定义的复数类,Complex,。,/Eg3-2.cpp,#include,class Complex,private:,double r;,double i;,public:,void,init(double,rr,double,ii),r=,rr;i,=ii;,double real()return r;,double image()return i;,;,3.1.3,class,void main(),Complex a;,a.init(2,3);,cout,a.real,()+“,a.image,(),i“,endl,;,a.r,=6;/,错误,,a.i,=3.2;/,错误,4,、关于,class,的说明,类声明中的访问限定符,private,、,public,、,protected,没有先后次序之分,在一个类中,访问限定符,private,、,public,、,protected,的出现次数没有限制,数据成员和成员函数都可以设置为,public,、,private,或,protected,属性。出于信息隐藏的目的,常将数据成员设置为,private,权限,将需要让类的外部函数(非本类定义的函数)访问的成员函数设置为,public,权限。,3.1.3,class,数据成员可以是任何数据类型,,如整型、浮点型、字符型、数组、指针、引用等,也可以是另外一个类的对象或指向对象的指针,还可以是指向自身类的指针或引用,但,不能是自身类的对象,。此外,数据成员,不能指定为自动(,auto,)、寄存器(,register,)和外部(,extern,),存储类型。例如:,class A;,class B,private:,int,a;,A obja1;/,正确,A *obja2;/,正确,B *,objb,&objr,;/,正确,B b1;/,错误,auto,int,b;/,错误,extern,int,c;/,错误,public:,;,3.1.3,class,在声明(或定义)类时,不能为数据成员赋初值。例如:,class A,private:,int,a=0;/,错误,int,b3=1,2,3;/,错误,public:,;,3.1.3,class,类和结构的区别,类定义种默认情况下的成员是,private;,结构定义种默认情况下的成员是,public;,在,C,中,结构中不能有成员函数;,struct,complex,double real;,double image;,public:,double,realcomplex,();,double,imagecomplex,();,double,abscomplex,();,;,class complex,double real;,double image;,public:,double,realcomplex,();,double,imagecomplex,();,double,abscomplex,();,;,public,private,3.1.3,class,1,、成员函数,(,方法,),的定义,(,1,)在类声明中定义(内置函数),(,2,)在类声明以外定义,返回类型,类名,:,成员函数名称,(,参数表,),函数体,注:将类定义和其成员函数的定义分开是目前开发程序的通常做法。把类的定义(头函数)看成是类的外部接口,类的成员函数的定义看成是类的内部实现。,3.2,成员函数,2,、定义成员函数的案例,class Date,int,day,month,year,;,public:,void,init(int,int,int,);,int,getDay,();,int,getYear()return,year;,;,int,Date:getDay,()return day;,void,Date:init(int,d,int,m,int,y),day=d;,month=m;,year=y;,3.2,成员函数,关于,内联成员,函数,#include,class point,private:,int,x,y,;,public:,void,setpoint(int,int,);,int,getx,();,int,gety,();,;,inline void,point:setpoint(int,a,int,b),x=a;,y=b;,inline,int,point:getx()return,x;,inline,int,point:gety()return,y;,main(),int,x=9,y=20;,point p1;,p1.setpoint(x,y);,cout,point.x,=p1.getx(),endl,;,cout,point.y,=p1.gety(),endl,;,#include,class point,private:,int,x,y,;,public:,void,setpoint(int,a,int,b),x=a;,y=b;,int,getx()return,x;,int,gety()return,y;,;,main(),int,x=9,y=20;,point p1;,p1.setpoint(x,y);,cout,point.x,=p1.getx(),endl,;,cout,point.y,=p1.gety()”,作为指针对象和对象成员之间的间隔符,例如:,Clock*,pClock,;,pClock,=new Clock;,pClock,-setHour(10);,pClock,-,dispTime,();,3.4,对象,4,、对象赋值,对象名,1,对象名,2,;,Clock*pa,*,pb,aClock,bClock,;,bClock,=,aClock,;,pa=new Clock;,pb,=pa;,1,、两个对象必须类型相同,2,、进行数据成员的值拷贝,赋值之后,两不相干,3,、若对象有指针数据成员,赋值可能产生问题,3.4,对象,3.4,对象,【,例,3-3】Clock,类及其对象的完整例程。,/Eg3-3.cpp,#include,#include,using namespace std;,class Clock,public:,void,setHour(int,h)hour=h;,void,setMinute(int,m)minute=m;,void,setSecond(int,s)second=s;,void,dispTime,(),cout,Now is:hour:minute:secondsetHour(10);,pa-setMinute(23);,pa-setSecond(34);,pb,=pa;,pa-,dispTime,();,pb,-,dispTime,();,aClock.dispTime,();,bClock.dispTime,();,3.5,构造,函数与析构函数,构造函数与析构函数是两个极其特殊的函数,它们由系统自动执行,在程序中不可显示地调用它们。理解这两个函数对学好面向对象程序设计技术是大有帮助的。,构造函数的主要作用是用于建立对象时对对象的数据成员进行初始化;而析构函数主要用于对象生命期结束时回收对象。,3.5.1,构造,函数,1,、构造函数的概念,构造函数(,constructor,)是与类同名的特殊成员函数,主要用来初始化对象的数据成员。其在类中的定义形式如下:,class X,X(),;,3.5.1,构造,函数,2,、构造函数的特点,构造函数与类同名。,构造函数没有返回类型。,构造函数可以被重载。,构造函数由系统自动调用,不允许在程序中显式调用。,引用构造函数的原因,自动完成数据成员初始化,减少出错几率,3,、构造函数的调用,只能在定义对象时,由系统自动调用!,调用形式:,类名 对象名(参数表);,系统将根据参数表调用某个构造函数,若无参数表将调用缺省构造函数。,不允许程序员在程序中显示调用构造函数的名称,任何时候都不允许!,3.5.1,构造,函数,3.5.1,构造,函数,【,例,3-4】,一个桌子类的构造函数。,/Eg3-4.cpp,#include,using namespace std;,class Desk,public:,Desk(int,int,int,int,);/,构造函数声明,void,setWeight(int,w)weight=w;,private:,int,weight,length,width,high,;,;,Desk:Desk(int,ww,int,l,int,w,int,h)/,构造函数定义,weight=,ww,;high=l;,width=w;length=h;,cout,call constructor !,endl,;,void main(),Desk d1(2,3,3,5);,3.5.1,构造,函数,4,、使用构函数函数应注意的问题,构造函数不能有返回类型,即使,void,也不行。,构造函数由系统自动调用,不能在程序中显式调用构造函数。,构造函数的调用时机是定义对象之后的第一时间,即构造函数是对象的第一个被调用函数。,定义对象数组或用,new,创建动态对象时,也要调用构造函数。但定义数组对象时,必须有不需要参数的构造函数,构造函数通常应定义为公有成员,因为在程序中定义对象时,要涉及构造函数的调用,尽管是由编译系统进行的隐式调用,但也是在类外进行的成员函数访问。,1,、析构函数的概念,析构函数(,destructor,)是与类同名的另一个特殊成员函数,作用与构造函数相反,用于在对象生存期结束时,完成对象的清理工作。,2,、定义语法,class X,X(),;,3,、析构函数特点,函数名为,加类名,无参数,无返回值,不能重载:每个类仅有一个析构函数,3.5.2,析构,函数,4,、析构函数调用时机,对象生命期结束时自动调用,自动,/,局部对象:定义的语句块结束处,全局对象:程序结束时,静态对象:程序结束时,使用,一般情况下,缺省的析构函数可以信任,善后处理,一般是释放动态分配的内存,3.5.2,析构,函数,【,例,3-5】,析构函数和构造函数的应用。,/Eg3-5.cpp,#include,using namespace std;,class A,private:,int,i;,public:,A(int,x)i=x;,cout,constructor:i,endl,;,A(),cout,destructor:i,endl,;,;,void main(),A a1(1);,A a2(2);,A a3(3);,A a4(4);,3.5.2,析构,函数,5,、使用析构说明,若有多个对象同时结束生存期,,C+,将按照与调用构造函数相反的次序调用析构函数。,每个类都应该有一个析构函数,如果没有显式定义析构函数。,C+,将产生一个最小化的默认析构函数。,构造函数和析构函数都可以是,inline,函数,在通常情况下,析构函数与构造函数都应该被设置为类的公有成员,虽然它们都只能被系统自动调用的,但这些调用都是在类的外部进行的。,3.5.2,析构,函数,3.5.2,析构,函数,【,例,3-6】,用析构函数释放构造函数分配的自由存储空间。,#include,using namespace std;,class B,private:,int,*a;char*pc;,public:,inline,B(int,x),a=new int10;pc=new char;,inline B(),delete a;delete pc;,;,void main(),B x(1);,3.5.2,无参,构造函数,无参数构造函数指在定义对象时,不需要提供参数的构造函数。在一些情况下,如定义数组,必须使用无参构造函数,因此需要引起重视。,3.5.2,无参,构造函数,1,、系统默认构造函数,C+,规定,每个类必须有构造函数,如果一个类没有定义任何构造函数,在,需要,时编译器将会为它生成一个,默认构造,函数。,class X,X()/,系统默认构造函数类似于此,在用默认构造函数创建对象时,如果创建的是全局对象或静态对象,则对象所有数据成员初始化为,0,;如果创建的是局部对象,即不进行对象数据成员的初始化。,3.5.2,无参,构造函数,【,例,3-7】point,类的默认构造函数。,/Eg3-7.cpp,#include,using namespace std;,class point,private:,int,x,y,;,public:,void,setpoint(int,a,int,b)x=a;y=b;,int,getx,()return x;,int,gety,()return y;,;,point p1;/,定义全局对象,void main(),static point p2;/,定义静态局部对象,point p3;/,定义局部对象,cout,p1:p1.getx(),p1.gety(),endl,;,cout,p2:p2.getx(),p2.gety(),endl,;,cout,p3:p3.getx(),p3.gety(),endl,;,说明:在类没有定义任何构造函数时,系统才会产生默认构造函数。,一旦定义了任何形式的构造函数,系统就不再产生默认构造函数。,【,例,3-8】,未定义无参构造函数引发的错误。,#include,using namespace std;,class point,private:,int,x,y,;,public:,point(int,a,int,b)x=a;y=b;,/,;,point p1;,void main(),static point p2;,point p3,*p4,a10;,p4=new point;,2,、重定义无参数构造函数,系统生成的默认无参数构造函数,并未对对象的数据成员作什么实际的初始化工作。,C+,允许显式定义无参数的构造函数,这样就能通过它为对象的数据成员提供初始值。,有时为了让类能够正常工作,必须显示提供无参构造函数,如例,3-8,。,3.5.2,无参构造函数,注意,关于无参构造函数:,X:X(),在,class,没有定义任何构造函数时,系统可能动会产生缺省无参构造函数。,一旦定义了任意的构造函数。系统就不会产生缺省的无参构造函数,3.5.2,无参,构造函数,【,例,3-9】,定义,Point,类的无参数构造函数,将,point,对象的数据成员初始化为,0,。,#include,using namespace std;,class point,private:,int,x,y,;,public:,point(int,a,int,b)x=a;y=b;,int,getx,()return x;,int,gety,()return y;,point()x=0;y=0;,/,显式定义无参构造函数,;,point p1(1,1);/,调用构造函数,point(int,int,),void main(),static point,p2,;/,调用构造函数,point(),point,p3,a10;,/,调用构造函数,point(),point *p4;,p4=new point;/,调用构造函数,point(),cout,p1:p1.getx(),p1.gety(),endl,;,cout,p2:p2.getx(),p2.gety(),endl,;,cout,p3:p3.getx(),p3.gety(),endl,;,cout,getx,(),gety,(),endl,;,3.5.2,定义,缺省参数构造函数,在数据成员的取值比较固定时,可以通过为构造函数参数提供缺省参数初始化它们。,【,例,3-10】,定义,point,类的缺省参数构造函数。,/Eg3-10.cpp,#include,using namespace std;,class point,private:,int,x,y,;,public:,point(int,a=0,int b=0)x=a;y=b;/,缺省参数构造函数,int,getx,()return x;,int,gety,()return y;,;,缺省参数的构造函数与无参构造函数的冲突问题,class X,public:,X();,X(int,i=0)x=i;,private:,int,x;,;,main(),X one(12);,X two;,X two,调用:,X:,X(),还是,X:X(int,i=0),构造函数可以重载。与普通函数的重载一样,重载的构造函数必须具有不同的函数原型,【例,3-12】,有一日期类,重载其构造函数。,class,Tdate,public:,Tdate,();,Tdate(int,d);,Tdate(int,m,int,d);,Tdate(int,m,int,d,int,y);,/,其他公共成员,protected:,int,month;,int,day;,int,year;,;,3.5.3,重载,构造函数,Tdate:Tdate,(),month=4;day=15;year=1995;,cout,month/day/year,endl,;,Tdate:Tdate(int,d),month=4;day=d;year=1996;,cout,month/day/year,endl,;,Tdate:Tdate(int,m,int,d),month=m;day=d;year=1997;,cout,month/day/year,endl,;,Tdate:Tdate(int,m,int,d,int,y),month=m;day=d;year=y;,cout,month/day/year,endl,;,3.5.3,重载,构造函数,void main(),Tdate,aday,;,Tdate,aday,(,);/,可以吗?,Tdate,bday(10);,Tdate,cday(2,12);,Tdate,dday(1,2,1998);,定义一个返回类型为,Tdate,的无参函数。,与对象,aday,冲突,3.5.3,重载,构造函数,将上面的几个构造函数结合为一个:,class,Tdate,public:,Tdate(int,m=4,int d=15,int y=1995),month=m;day=d;year=y;,cout,month/day/year,endl,;,/,其他公共成员,protected:,int,month;,int,day;,int,year;,;,3.5.3,重载,构造函数,3.5.4,拷贝构造函数,1,、什么是拷贝构造函数,拷贝构造函数是一个特殊的构造函数,用于根据已存在的对象初始化一个建新对象。它的形式如下:,class X,public:,X(const,X/,拷贝构造函数的常见原型,3.5.4,拷贝,构造函数,2,、默认拷贝构造函数,如果没有定义类的拷贝构造函数,在需要的时候,,C+,将产生一个具有最小功能的默认拷贝构造函数,类似于下面的形式:,X:X(const,X&),默认拷贝构造函数以成员按位拷贝(,bit-by-bit,)的方式实现成员的复制。当一个类有指针类型的数据成员时,默认拷贝构造函数常会产生指针悬挂问题。,3.5.4,拷贝,构造函数,【,例,3-13】,默认拷贝构造函数引起的指针悬挂问题。,/Eg3-13.cpp,#include,#include,using namespace std;,class Person,private:,char*name;,int,age;,public:,Person(char,*,Name,int,Age);,Person();,void,setAge(int,x)age=x;,void print();,;,Person:Person(char,*,Name,int,Age),name=new charstrlen(Name)+1;,strcpy(name,Name,);,age=,Age,;,cout,constructor.,endl,;,Person:Person,(),cout,destructor.age,endl,;,delete name;,void,Person:print,(),cout,name t The Address of name:name,endl,;,void main(),Person p1(,张勇,21);,Person p2=p1;/,调用默认拷贝构造函数,p1.setAge(1);,p2.setAge(2);,p1.print();,p2.print();,3.5.4,拷贝,构造函数,Person p2=p1,调用默认拷贝构造函数,用,p1,构造,p2,对象。,当,p2,结束生命期被析构时,,p1,的,name,成员就指向了被,p2,的,delete,的存储区域,产生指针县挂问题,3.5.4,拷贝,构造函数,3,定义拷贝构造函数,解决上述问题的方法是为类提供拷贝构造函数,【,例,3-14】,为例,3-13,的,Person,定义拷贝构造函数。,/Eg3-14.cpp,class Person,public:,Person(const,Person,;,Person:,Person(const,Person&p),name=new charstrlen(p.name)+1;,strcpy(name,p.name,);,age=,p.age,;,cout,Copy constructor.,endl,;,3.5.4,拷贝,构造函数,4,拷贝构造函数说明,(,1,)拷贝构造函数与一般构造函数相同,与类同名,没有返回类型,可以重载。,(,2,)拷贝构造函数的参数常常是,const,类型的本类对象的引用。,(,3,)在多数情况下,默认拷贝构造函数能够完成对象的复制创建工作,但当类具有指针类型的数据成员时,默认拷贝构造函数就可能产生指针悬挂问题,需要提供显式的拷贝构造函数。,(,4,)对拷贝构造函数的调用常在类的外部进行,应该将它指定为类的公有成员。,3.5.4,拷贝,构造函数,(,5,)调用拷贝构造函数的时机是用已存在的对象初始化同类的新对象。至少以下几种情况会导致拷贝构造函数的调用。,class X;,X obj1;,X obj2=obj1;/,情况,1,:调用拷贝构造函数,X obj3(obj1);/,情况,2,:调用拷贝构造函数,f(X,o);/,情况,3,:以对象作函数参数时,调用拷贝构造函数,3.6,构造,函数与初始化列表,1,、什么是初始化列表,成员初始化列表类似于下面的形式,构造函数名,(,参数表,),:成员,1(,初始值,),成员,2(,初始值,),介于参数表后面的“:”与函数体,之间的内容就是成员初始化列表。其含义是将括号中的初始值参数的值赋给该括号前面的成员。,3.6,构造,函数与初始化列表,【,例,3-15】,用初始化列表初始化,Tdate,的,month,和,day,成员。,/Eg3-15.cpp,#include,using namespace std;,class,Tdate,public:,Tdate(int,m,int,d,int,y);,/,其他公共成员,protected:,int,month,day,year;,;,Tdate:Tdate(int,m,int,d,int,y):month(m),day(d,),year=y;,cout,month/day/year,endl,;,void main(),Tdate,bday2(10,1,2003);,3.6,构造,函数与初始化列表,2,、使用构造函数初始化列表的注意,构造函数初始化列表中的成员初始化次序与它们在类中的声明次序相同,与初始列表中的次序无关。如对例,3-15,中的类而言,下面,3,个构造函数是完全相同的。,Tdate:Tdate(int,m,int,d,int,y):month(m),day(d),year(y,),Tdate:Tdate(int,m,int,d,int,y):year(y),month(m),day(d,),Tdate:Tdate(int,m,int,d,int,y):day(d),year(y),month(m,),尽管三个构造函数初始化列表中的,month,、,day,和,year,的次序不同,但它们都是按照,monthdayyear,的次序初始化的,这个次序是其在,Tdate,中的声明次序。,3.6,构造,函数与初始化列表,构造函数初始化列表先于构造函数体中的语句执行。,常量成员,引用成员,类对象成员,派生类构造函数对基类构造函数的调用,必须采用初始化列表,进行初始化,class X,private:,const,int,ic,;,int,&,ir,;,int,i;,public:,X():,ic,(100),ir(i),i=300;,;,;,【,例,3-17】,常量和引用成员的初始化。,在声明,class x,时,系统并不为其中的数据成员分配存储空间,此时的内存变中,还没有,ic,ir,,又如何能够存放值呢?,这就是答案,!,3.6,构造,函数与初始化列表,3.7,静态成员,常规成员,每个对象拥有独立的数据成员拷贝,不能在确定对象之外存在,静态数据成员,static data member,被类的所有成员所共享,与类关联,而不与特定的对象关联,即便类没有任何对象时,就已经存在,生命期与程序相同,3.7.1,静态,数据成员,1,静态数据成员的声明,class X,static,类型 静态成员名,;,2,静态数据成员的定义,有以下两种定义形式:,类型 类名,:,静态成员名,;,类型 类名,:,静态成员名,=,初始值,;,注意:在类外定义静态数据成员时,不能加上,static,限定词;在定义静态数据成员时可以指定它的初始值(第,2,种定义形式),若定义时没有指定初值,,系统默认其初值为,0,。,3.7.1,静态,数据成员,3,静态数据成员的访问,静态成员属于整个类,两种方式访问。,通过类名访问(这种访问方式是非静态成员不具有的):,类名,:,静态成员名,;,通过对象访问:,对象名,.,静态成员名,;,【,例,3-18】,设计一个银行类,该类对象是一个个银行账户,统计该类对象的个数。,/Eg3-18.cpp,#include,using namespace std;,class Account,public:,Account(char,*,Name,char,*,Psw,);,Account()number+;,Account()number-;,int,getNumber()return,number;,private:,char name10;,char psw6;,static,int,number;/,保存对象个数,;,Account:Account(char,*,Name,char,*,Psw,),strcpy(name,Name,);,strcpy(psw,Psw,);,number+;,int,Account:number,;/,定义,void main(),Account za(tom,123456);,cout,za.getNumber,(),;,Account a3;,cout,za.getNumber,(),;,Account,x,y,;,cout,za.getNumber,(),;,cout,za.getNumber,(),member,3,、,this,指针的实现,【例,3-20】,一个,point,类。,class point,private:,int,x,y,;,public:,point(int,a,int,b=10),x=a;y=b;,int,getx,(),return x;,int,gety,(),return y;,void,move(int,a,int,b),x=,a;y,=b;,;,Main(),point p1,p2;,p1.move(10,20,p2.move(3,4);,1,、编译器改变类成员的定义,用额外的,this,指针重新定义每个类成员函数,inline,point(point,*,this,int,a,int,b),inline,getx(point,*,this)return,this-x;,inline,gety(point,*,this)return,this-y;,inline void,move(point,*this,int,a,int,b),this-x=,a;this,-y=b;,inline void move(&p1,10,20),inline void move(&p2,3,4),2,、编译器改变每个类成员函数的调用,加上一个额外的实参,即被调用对象的地址,使用,this,指针,区分二义性,class X,int,i;,f(,int,i),this-i=i;,使用,this,指针,返回调用对象,class X,X&f()return,*this,;,X&g()return,*this,;,;,X a;,a.f().g,();,3.8 this,指针,4,、,this,指针的两种常见应用,3.8 this,指针,5,、关于,this,尽管,this,是一个,隐式,指针,但在类的成员函数中可以,显式地使用,它。,在类,X,的非,const,成员函数里,,this,的类型就时,X*,。然而,this,并不是一个常规变量,不能给它赋值,但可以通过它修改数据成员的值。在类的,const,成员函数里,,this,被设置成,const X*,类型,不能通过它修改对象的数据成员值。,静态成员函数没有,this,指针,,因此在静态成员函数中不能访问对象的非静态数据成员,3.8 this,指针,6,、,this,返回对象地址或自引用的成员函数,在类成员函数中,可以通过,this,指针返回对象的地址或引用,这也是,this,的常用方式。引用是一个地址,允许函数返回引用就意味着函数调用可以被再次赋值,即允许函数调用出现在赋值语句的左边。,【,例,3-21】,返回对象的指针和引用的成员函数,。,分析以下调用可行的原因:,d1.setYear(2007).setMonth(03).setDay(30),3.9,类对象成员,1,、类对象成员的基本知识,类的数据成员一般都是基本数据类型,但也可以是,结构、联合、枚举,之类的自定义数据类型,还可以是,其他类的对象,。,如果用其他类的对象作为类的成员,则称之为,对象成员,。,类对象作成员的形式如下:,class X,类名,1,成员名,1;,类名,2,成员名,2;,类名,n,成员名,n,;,;,2,、对象数据成员初始化的困惑,【,例,3-22】,对象成员的初始化。,class,StudentID,public:,StudentID(int,id=0),value=id;,cout,Assigning student id value,endl,;,StudentID,(),cout,Destructing id value,endl,;,protected:,int,value;,;,3.9,类,对象成员,class Student,public:,Student(char,*,pName,=,noName,int,ssID,=0),cout,Constructing student ,pName,endl,;,strncpy(name,pName,sizeof(name,);,namesizeof(name)-1=0;,StudentID,id(ssID,);,/,希望将学号传给学号类对象,protected:,char name20;,StudentID,id;,;,void main(),Student s(Randy,9818);,运行结果是:,Assigning student id 0,Constructing student Randy,Assigning student id 9818,Destructing id 9818,Destructing id 0,3,、问题在于对象成员的初始化,修改例,3-22,的构造函数,class Student,public:,Student(char,*,pName,=no,name,int,ssID,=0,),:id(ssID),cout,Constructing student ,pName,endl,;,strncpy(name,pName,sizeof(name,);,namesizeof(name)-1=n;,;,运行结果是:,Assigning student id 9818,Con
    展开阅读全文
    提示  咨信网温馨提示:
    1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
    2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
    3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
    4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
    5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
    6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

    开通VIP折扣优惠下载文档

    自信AI创作助手
    关于本文
    本文标题:C++面向对象程序设计教学PPT3.ppt
    链接地址:https://www.zixin.com.cn/doc/13338616.html
    页脚通栏广告

    Copyright ©2010-2026   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:0574-28810668    微信客服:咨信网客服    投诉电话:18658249818   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   


    关注我们 :微信公众号  抖音  微博  LOFTER               

    自信网络  |  ZixinNetwork