![C程序设计类和对象的基础_第1页](http://file4.renrendoc.com/view/25838033536dadf7b94c274823efb8e9/25838033536dadf7b94c274823efb8e91.gif)
![C程序设计类和对象的基础_第2页](http://file4.renrendoc.com/view/25838033536dadf7b94c274823efb8e9/25838033536dadf7b94c274823efb8e92.gif)
![C程序设计类和对象的基础_第3页](http://file4.renrendoc.com/view/25838033536dadf7b94c274823efb8e9/25838033536dadf7b94c274823efb8e93.gif)
![C程序设计类和对象的基础_第4页](http://file4.renrendoc.com/view/25838033536dadf7b94c274823efb8e9/25838033536dadf7b94c274823efb8e94.gif)
![C程序设计类和对象的基础_第5页](http://file4.renrendoc.com/view/25838033536dadf7b94c274823efb8e9/25838033536dadf7b94c274823efb8e95.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
会计学1C程序设计类和对象的基础一、类与对象的定义什么是类?类是一种新的数据类型。类是逻辑相关的函数和数据的封装,是对所处理的问题的抽象描述,所以,类是实现抽象类型的工具。类(Class):是一种用户定义的类型,它包括定义的数据和其对应的操作(函数)。使用对象将数据和操作进行封装(Encapsulation)。第1页/共61页什么是对象?类实例化后便生成对象。对象(Object):含有数据(对象的属性Attribute)又含有对数据的操作代码(Method)的一个逻辑封装体。属性:描述对象特征的数据。方法:对属性的操作。面向对象编程利用对象进行程序设计第2页/共61页1.类的定义类的定义一般分为说明部分和实现部分。说明部分:类中的成员数据成员成员函数的说明实现部分成员函数的具体定义例如:定义一个汽车类型号、外壳、车轮等(数据成员)启动、加速和停止等(成员函数)第3页/共61页类的定义格式:class<类名>{
public:
<公有数据成员和成员函数的说明或实现>
private:
<私有数据成员和成员函数的说明或实现>protected:<保护数据成员和成员函数的说明或实现>};
<各个成员函数的实现>第4页/共61页例:坐标点类问题:将坐标点与相应操作封装成类classTPoint{
public:
voidSetxy(inta,intb);//说明在类体内,定义在类体外
voidMove(int,int);//函数原型声明,参数名可给可不给出
voidPrint();intGetx();intGety();
private:
intx,y;//数据成员};
第5页/共61页例:坐标点类(续上)问题:将坐标点与相应操作封装成类voidTPoint::Setxy(inta,intb){
x=a;y=b;}voidTPoint:move(inta,intb){
x=x+a;y=y+b;}voidTPoint::Print();{
cout<<"x="<<Getx()<<"y="<<Gety();}intTPoint::Getx(){returnx;}intTPoint::Gety(){returny;}在类体外定义成员函数的一般格式为:<函数类型><类名>::<成员函数>(<参数表>){<函数体>}其中,作用域运算符“::”是用来标识成员函数是属于哪个类的,
“类名”是成员函数所属类的名字。若在函数前加关键词inline,
则成为内联成员函数。若函数较短,可以在类内定义,也称作
内联成员函数。第6页/共61页例:坐标点类(内联函数形式)问题:将说明部分和实现部分都在类体内定义。classTPoint//类名{
public://声明其后为公有成员
voidSetxy(inta,intb){x=a;y=b;}voidMove(inta,intb){x=x+a;y=y+b;}voidPrint(){cout<<"x="<<Getx()<<"y="<<Gety();}intGetx(){returnx;}intGety(){returny;}
private:
intx,y;//数据成员};
第7页/共61页2.对象的定义与使用对象的定义格式:
<类名><对象名列表>说明:<类名>是定义对象所属类的名字。<对象名列表>可有多个对象名,用逗号分隔。例如:TPointp1,p2;//定义TPoint类型的对象p1和p2。TPoint*p=&p1;//定义指向对象p1的TPoint类型的指针p。TPoint&c=p2;//定义c为TPoint类型对象p2的引用。TPointm[5];//定义一个TPoint类型的对象数组。第8页/共61页2.对象的定义与使用对象中数据成员和成员函数的表示方式1:<对象名>.<成员名><对象名>.<成员名>(<参数表>)例如:p1.x,p1.y,p1.Setxy(2,3)对象中数据成员和成员函数的表示方式2:<对象指针名>-><成员名>或者(*<对象指针名>).<成员名><对象指针名>-><成员名>(<参数表>)或者(*<对象指针名>).<成员名>(<参数表>)例如:p->x,p->y,p->Getxy(inta,intb)或者(*p).x,(*p).y,(*p).Getxy(inta,intb)第9页/共61页例7.1问题:对象的定义和成员函数的调用。#include<iostream.h>#include"Tpoint.h"voidmain(){TPointp1,p2;TPoint*p=&p1;p1.Setxy(1,2);cout<<"x="<<p1.Getx()<<"y="<<p1.Gety()<<endl;p2.Setxy(3,4);cout<<"x="<<p2.Getx()<<"y="<<p2.Gety()<<endl;p->Setxy(5,6);//或(*p).Setxy(5,6)cout<<"x="<<p->Getx()<<"y="<<p->Gety()<<endl;p1.Move(1,2);p2.Move(3,4);(*p).Move(5,6);//或p->Move(5,6);p1.Print();p2.Print();p->Print();}该程序的运行结果为x=1y=2x=3y=4x=5y=6x=11y=14x=6y=8x=11y=14第10页/共61页对象定义的实质定义一个类,就相当于定义了一种类型,它并不会接受或存储具体的值,只作为一个样板,只有被实例化生成对象以后,系统才为对象分配存储空间。为节省内存,在创建对象时,只为每个对象的数据成员分配内存,而成员函数只是一次性存放在静态存储区中,为所有的对象共享。例如:TPointp1,p2;类TPointintx,yvoidSetxy(inta,intb);voidMove(int,int);voidPrint();intGetx();intGety();p1对象intx,yp2对象intx,y第11页/共61页二、对象的初始化在类的定义中,无法用表达式初始化数据成员,因此,在声明一个对象时,对象的初始状态是不确定的,需要初始化。对象初始化可以使用:构造函数析构函数复制构造函数第12页/共61页1.构造函数构造函数是一种特殊的成员函数,它主要用来为对象分配空间,给他的数据成员赋值(初始化)并执行对象的其他内部管理操作。说明:构造函数的名字必须与类的名字相同,并且构造函数无返回值,不允许定义构造函数的返回值类型,包括void类型。但允许有参数。构造函数是成员函数,函数体可写在类体内,也可写在类体外。构造函数可以重载。注意:构造函数在对象创建时由系统自动调用,这是它与类的普通成员函数之间的最大区别。构造函数的定义格式如下:<类名>::<构造函数名>{<函数体>}第13页/共61页例7.2问题:构造函数的定义举例。#include<iostream>classTpoint{public:Tpoint(intm,intn){x=m;y=n;}//定义构造函数intGetx(){returnx;}intGety(){returny;}private:intx,y;};voidmain(){Tpointa(10,20);Tpointb(15,25);cout<<a.Getx()<<","<<a.Gety()<<endl;cout<<b.Getx()<<","<<b.Gety()<<endl;}该程序的运行结果如下:10,2015,25第14页/共61页2.析构函数析构函数也是类中的特殊成员函数,与类名字相象,在前加一个波浪号“~”。它没有参数,也没有返回值,在一个类中只能有一个析构函数。析构函数执行与构造函数相反的操作。通常用于释放分配给对象的存储空间,当程序超出类对象的作用域时,或者当对一个类指针使用运算符delete时,将自动执行析构函数。说明:和构造函数一样,如果不定义析构函数,编译程序将提供一个缺省的析构函数。对大多数类来说,缺省的析构函数就能满足要求,如果在一个对象完成其操作之前还需要做一些内部处理,则应显式的定义析构函数。析构函数的定义格式如下:<类名>::~<析构函数名>{<函数体>}注意:析构函数仅能有一个,不能重载。第15页/共61页例7.3问题:构造函数和析构函数举例。#include<iostream>classTpoint{public: Tpoint(intm,intn){x=m;y=n;}//定义构造函数 ~Tpoint();intGetx(){returnx;} intGety(){returny;}private:intx,y;};Tpoint::~Tpoint(){cout<<"Destructorcalled.\n";}voidmain(){Tpointa(10,20);Tpointb(15,25);cout<<a.Getx()<<","<<a.Gety()<<endl;cout<<b.Getx()<<","<<b.Gety()<<endl;}该程序的运行结果如下:10,2015,25Destructorcalled.Destructorcalled.第16页/共61页类的构造函数和析构函数注意:类的构造函数在程序中为对象创建时分配系统资源提供了初始化的方法;析构函数为对象撤销时释放系统资源提供了方法。无论用户是否定义构造函数和析构函数,它们都默认存在。只要定义了新类,类的对象在创建和撤销时,构造函数和析构函数将会被调用。第17页/共61页3.复制构造函数已有变量可以初始化另一个变量:inta=5;intb=a;同样,已有对象也可以初始化另一个对象。复制构造函数是一种特殊的成员函数,其功能是用一个已经初始化过了的对象去初始化另一个新创建的对象。复制构造函数的定义格式如下:<类名>::<复制构造函数名>(<类名>&<引用名>){<函数体>}注意:它只有一个参数,是对某个对象的引用。第18页/共61页例7.4问题:调用复制构造函数的例子。#include<iostream>classTpoint{public: Tpoint(intm,intn);//定义构造函数 ~Tpoint();//定义析构函数 Tpoint(Tpoint&r);//定义复制构造函数intGetx(){returnx;}intGety(){returny;}private:intx,y;};Tpoint::Tpoint(intm,intn){cout<<"Callconstructor.\n";x=m;y=n;}Tpoint::Tpoint(Tpoint&r){cout<<"Copyconstructor.\n";x=r.x;y=r.y;}Tpoint::~Tpoint(){cout<<"Destructorcalled.\n";}第19页/共61页例7.4问题:调用复制构造函数的例子。voidmain(){Tpointa(10,20);Tpointb(15,25);Tpointc(a);cout<<a.Getx()<<","<<a.Gety()<<endl;cout<<b.Getx()<<","<<b.Gety()<<endl;cout<<c.Getx()<<","<<c.Gety()<<endl;}该程序的运行结果为:Callconstructor.Callconstructor.Copyconstructor.10,2015,2510,20Destructorcalled.Destructorcalled.Destructorcalled.第20页/共61页7.3成员函数的特性成员函数除了说明和定义之外,还有一些相关的特性:内联函数和外联函数成员函数重载设置参数的缺省值第21页/共61页1.内联函数和外联函数类的成员函数可以分为内联函数和外联函数。内联函数是指那些定义在类体内的成员函数,即该函数的函数体放在类体内。而说明在类体内,定义在类体外的成员函数叫外联函数。外联函数的函数体在类的实现部分。两者的区别:一般函数进行调用时,要将程序执行权转到被调用函数中,然后再返回到调用它的函数中;而内联函数则是在编译时,将调用表达式用内联函数体来替换。这样在使用时去掉了调用环节,提高运行速度。缺点:如果内联函数代码过大,则目标程序会加大。第22页/共61页例7.5问题:内联函数与外联函数实例。#include<iostream.h>classA{public:A(intm,intn)//内联函数,定义在类体内{x=m;y=n;}intGetx(){returnx;}//内联函数,定义在类体内intGety(){returny;}//内联函数,定义在类体内intsumxy();//内联函数,定义在类体外,但进行了转化intarea();//外联函数,定义在类体外private:intx,y;};inlineintA::sumxy()//由外联函数转化为内联函数{returnGetx()+Gety();}intA::area(){returnGetx()*Gety();}voidmain(){As(10,20);cout<<"sum="<<s.sumxy()<<","<<"area="<<s.area()<<endl;}在使用内联函数时,应注意以下几点:(1)在内联函数内不允许用循环语句和开关语句。(2)内联函数的定义必须出现在内联函数第一次被调用之前。(3)内联函数无法进行递归调用。第23页/共61页2.成员函数重载在前面介绍的成员函数中,除了析构函数不能重载外,其他的成员函数都可以进行重载。但重载必须满足以下条件之一:参数个数不同。参数类型不同。当参数个数相同时,参数类型至少有一个不同。仅有返回值不同的函数是不能重载的。第24页/共61页例7.6问题:成员函数重载实例。#include<iostream.h>classB{public:B(inta){x=a+1;y=a;}B(inta,intb){x=a;y=b;}intadd();intadd(inta);intadd(inta,intb);intGetx(){returnx;}intGety(){returny;}private:intx,y;};intB::add(){returnx+y;}intB::add(inta){x=y=a;returnx+y;}intB::add(inta,intb){x=a;y=b;returnx+y;}第25页/共61页例7.6问题:成员函数重载实例。voidmain(){Bm(5,7),n(6);cout<<"m="<<m.Getx()<<","<<m.Gety()<<endl;cout<<"n="<<n.Getx()<<","<<n.Gety()<<endl;inti=m.add();intj=m.add(1,2);intk=n.add(4);cout<<i<<endl<<j<<endl<<k<<endl;}该程序的运行结果为:m=5,7n=7,61238第26页/共61页3.设置参数的缺省值成员函数和普通函数一样,可以设置参数的缺省值。一般的成员函数和构造函数都可以被设置参数的缺省值。第27页/共61页例7.7问题:设置默认参数应用举例。#include<iostream>usingnamespacestd;classB{public: B(inta=10,intb=20,intc=30); intGetx(){returnx;} intGety(){returny;}
intGetz(){returnz;}private:intx,y,z;};B::B(inta,intb,intc){x=a;y=b;z=c;}第28页/共61页例7.7问题:设置默认参数应用举例。voidmain(){Bi,j(1),k(1,2),r(1,2,3);cout<<"i="<<i.Getx()<<""<<i.Gety()<<""<<i.Getz()<<endl;cout<<"j="<<j.Getx()<<""<<j.Gety()<<""<<j.Getz()<<endl;cout<<"k="<<k.Getx()<<""<<k.Gety()<<""<<k.Getz()<<endl;cout<<"r="<<r.Getx()<<""<<r.Gety()<<""<<r.Getz()<<endl;}该程序的运行结果为:i=102030j=12030k=1230r=123第29页/共61页四、静态成员静态成员可以实现多个对象之间的数据共享,并且使用静态成员还不会破坏隐藏的原则,保证了安全性。静态数据成员静态成员函数第30页/共61页1.静态数据成员静态数据成员是类的所有对象中共享的成员,而不是某个对象的成员。弥补了全局变量的不足,它相对于类中的“全局变量”。注意:静态成员所占空间不会随着对象的产生而分配,随着对象的消失而回收。第31页/共61页例7.8问题:静态数据成员定义。#include<iostream>usingnamespacestd;classtime{public:time(int,int);voiddisplay();private: staticinthour;//hour是一个静态数据成员。intminute;intsecond;};第32页/共61页例7.8问题:静态数据成员定义。time::time(intm,ints):minute(m),second(s){};inttime::hour=15;voidtime::display(){cout<<hour<<":"<<minute<<":"<<second<<endl;}voidmain(){timet1(06,20),t2(10,30);t1.display();t2.display();}该程序的运行结果为:15:6:2015:10:30第33页/共61页说明:静态数据成员的初始化应在类体外进行,其格式如下:<数据类型><类名>::<静态数据成员名>=<初值>例如,inttime::hour=15;在数据成员前不加static,而应使用作用域运算符来表明所属类。在程序中如果静态数据成员的访问权限为公有(public)成员,则可按如下格式引用:<类名>::<静态成员名>//前面直接用类名静态数据成员被存放在静态存储区。第34页/共61页2.静态成员函数在静态成员函数的实现中,可以直接引用静态成员,但不能直接引用非静态成员,如果要引用非静态成员时,可通过对象来引用。对静态成员函数的引用,在程序中一般使用下列格式:类名.静态成员函数(参数表)有时,也可以由对象来引用,格式如下:对象.静态成员函数(参数表)第35页/共61页例7.9问题:静态成员函数对非静态成员的引用。#include<iostream.h>classtest{public:test(inta){A=a;B+=a;}
staticvoidf(testm);
//静态公有成员函数声明private:
intA;
staticintB;//静态私有成员};第36页/共61页例7.9问题:静态成员函数对非静态成员的引用。inttest::B=0;//静态成员初始化voidtest::f(testm){cout<<"A="<<m.A<<endl;//引用类的非静态成员,用对象引用cout<<"B="<<B<<endl;//引用类的静态成员,直接引用}voidmain(){testX(10),Y(20);test::f(X);//调用静态成员函数test::f(Y);//调用静态成员函数}该程序的运行结果为:第37页/共61页静态成员函数的使用注意:只能访问类的静态数据成员,而不能直接访问类中的普通成员(需用点域法)静态成员函数与类相联系,而不与类的对象相联系,所以在类的外部调用类中的公有静态成员函数,必须在其左面加"类名::",而不是通过对象名调用公有静态成员函数。在类的外部不能调用类中的私有静态成员函数。第38页/共61页五、友元为了方便类内数据的访问,提出友元方案。两种形式友元函数友元类特点:破坏了类的封闭性和隐藏性,但是提高了程序的运行效率。第39页/共61页1.友元函数友元函数是定义在类外部的普通函数,但对它的说明是在类内部,在友元函数的说明前加关键字friend。友元函数说明格式:friend类型友元函数名(参数表);在类外定义友元函数的格式:类型函数名(类&对象);注意:友元函数不是成员函数,但可以访问类中的私有成员。声明可在私有部分,也可在公有部分,作用相同。友元函数的调用方式于普通函数相同。第40页/共61页Private:成员……public:pubf();……f()外部函数间接访问Private:成员……public:pubf();friendf();……f()友元函数指定友元关系直接访问无友元关系有友元关系友元函数关系示意图第41页/共61页例7.10问题:友元函数与普通函数。#include<iostream>usingnamespacestd;classStudent{private:intx;friendvoidgetf(Student&s);//在类中声明友元函数getf()};voidgetf(Student&s)//定义友元函数{s.x=10;
//友元函数通过对象引用类的私有成员cout<<s.x<<endl;}voidmain(){Students;getf(s);//调用该友元函数}该程序的运行结果为:10第42页/共61页例7.10问题:友元函数与普通函数。#include<iostream>usingnamespacestd;classStudent{private:intx;public:voidget()
//成员函数{x=20;cout<<x<<endl;}};voidmain(){Students;s.get();}该程序的运行结果为:20第43页/共61页2.友元类当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一个类的友元类。此时,该类的所有成员函数都可以访问另一个类中的所有成员。定义友元类的语句格式如下:friendclass<类名>;其中:friend和class是关键字,类名必须是程序中的一个已定义过的类。第44页/共61页类X……friendclassY;类Y友元非友元使用友元类注意事项:类X类YfriendclassX;类ZfriendclassY;友元友元非友元是单向的。如类A是类B的友元,但类B并不是类A的友元。不具有传递性。若类X是类Y的友元,类Y是类Z的友元,但类X不是类Z的友元。第45页/共61页例7.11问题:友元类实例。#include<iostream>usingnamespacestd;classX;classY{public:Y(){strcpy(cname,"计算机语言");}voidprint(){cout<<cname<<endl;}
friendclassX;//友元类的声明private:charcname[30];};第46页/共61页例7.11问题:友元类实例。classX{public:X(char*na,char*ena)
{strcpy(X::name,na);strcpy(X::ename,ena);}voidEditcname(Y&temp);
voidprint(){cout<<name<<endl;cout<<ename<<endl;}private:charname[20];charename[30];};voidX::Editcname(Y&temp){strcpy(ame,"计算机高级语言");}第47页/共61页例7.11问题:友元类实例。voidmain(){
Xa("C++语言程序设计",
"TheC++ProgrammingLanguage.");Yb;a.Editcname(b);a.print(); b.print();}该程序的运行结果为:C++语言程序设计TheC++ProgrammingLanguage.计算机高级语言第48页/共61页六、类的作用域类的作用域简称类域,它是指类的定义和相应成员函数的定义范围。注意:一个类在类域内对任何成员都是开放的,而对类域外的类或函数的访问受到限制。在类域中定义的变量不能使用auto,register和extern等修饰符,只能用static修饰符,而定义的函数也不能用extern修饰符。类本身可被定义在三种作用域内:全局作用域。(一般的C++类)在另一个类的作用域中。(嵌套类)在一个块的局部作用域中。(局部类)第49页/共61页例问题:全局作用域。intfork(void);//全局fork函数classProcess{intfork(void);......};成员函数fork隐藏了全局函数fork,前者能通过单目域运算符调用后者:intProcess::fork(void){intpid=::fork();//调用全局fork函数......}第50页/共61页例问题:嵌套类的例子。classRectangle{public:Rectangle(int,int,int,int);……private:
classPoint
{public:Point(int,int);private:intx,y;};PointtopLeft,botRight;};Rectangle::Point::Point(intx,inty)
{
…...
}同样,在类域外访问嵌套类需要限制类名,例如:Rectangle::Pointpt(1,1);第51页/共61页例问题:局部类的例子。voidRender(Image&image){classColorTable{public:ColorTable(void){/*...*/}AddEntry(intr,intg,intb){/*...*/}…...};ColorTablecolors;…...}第52页/共61页例问题:综合例子。classa{
intx;
//类变量x说明public:
intfun();
//类成员函数fun()说明}intx;
//全局变量x的说明intfun();
//全局函数fun()的说明inta::fun()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 古镇改造砖运输协议模板
- 服装服饰运输合同
- 农业抗旱物资运输合同
- 学校建筑石材配送协议
- 产业基地自动扶梯装修合同
- 文旅融合发展项目居间协议
- 丹阳六年级下数学试卷
- 桥梁液压爬模专项施工方案
- 铁路接触网拆除施工方案
- 北海中学期末数学试卷
- 北京市丰台区2024-2025学年九年级上学期期末语文试题(含答案)
- 二零二五年度能源行业员工劳动合同标准范本3篇
- 计划供货时间方案
- 2024年石柱土家族自治县中医院高层次卫技人才招聘笔试历年参考题库频考点附带答案
- 西藏事业单位c类历年真题
- 2024人教新目标(Go for it)八年级英语下册【第1-10单元】全册 知识点总结
- 2025中国移动安徽分公司春季社会招聘高频重点提升(共500题)附带答案详解
- 七年级英语下学期开学考试(深圳专用)-2022-2023学年七年级英语下册单元重难点易错题精练(牛津深圳版)
- 杭州市房地产经纪服务合同
- 放射科护理常规
- 新时代中小学教师职业行为十项准则
评论
0/150
提交评论