类和对象的使用-课件_第1页
类和对象的使用-课件_第2页
类和对象的使用-课件_第3页
类和对象的使用-课件_第4页
类和对象的使用-课件_第5页
已阅读5页,还剩114页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

类和对象1ppt课件主要内容构造函数,重载构造函数;析构函数对象数组和对象指针公用数据的保护:静态成员对象的赋值和复制:拷贝构造函数友元类模板2ppt课件

#include<iostream>usingnamespacestd;

classDate{

public:

voidsetDate(inty,intm,intd);

voidshowDate();private:

intyear,month,day;};voidDate::setDate(inty,intm,intd){year=y;month=m;day=d;}voidDate::showDate(){cout<<year<<"."<<month<<"."<<day<<endl;}构造函数3ppt课件voidmain(){Datedate1;

date1.setDate(2008,8,8);

cout<<"Date1output1:"<<endl;date1.showDate();}4ppt课件5ppt课件

#include<iostream>usingnamespacestd;

classDate{

public:

Data(inty,intm,intd);voidshowDate();

private:

intyear,month,day;};

Date::Date

(inty,intm,intd){year=y;month=m;day=d;}inlinevoidDate::showDate(){cout<<year<<"."<<month<<"."<<day<<endl;}构造函数6ppt课件利用构造函数创建对象其一般形式为:

类名对象名[(实参表)];

Datedate1(2008,8,8);7ppt课件voidmain(){

Datedate1(2008,8,8);cout<<"Date1output1:"<<endl;date1.showDate();}8ppt课件构造函数的特点类的一个成员函数;未声明返回值类型;名字与类名相同;未显式地调用。公有函数注意:一个类中可以定义多个参数个数或参数类型不同的构造函数。练习:仿照上例,编写coord类的构造函数9ppt课件构造函数的作用构造函数用于为对象分配空间和进行初始化classStudent{ stringname;

intage;

int*score;

intcourseNum;public: Student(stringn,inta,intcn);

voidshowStudent();};Student::Student(stringn,inta,intcn){name=n;age=a;courseNum=cn;score=new

int[courseNum];

for(inti=0;i<courseNum;i++)

cin>>score[i];}voidStudent::showStudent(){…………..}10ppt课件Date::Date

(inty,intm,intd){year=y;month=m;day=d;}Date::Date(){year=2001;month=1;day=1;}Date::Date(inty){year=y;month=1;day=1;}

inlinevoidDate::showDate(){cout<<year<<"."<<month<<"."<<day<<endl;}

#include<iostream>usingnamespacestd;

classDate{

public:

Date(inty,intm,intd);Date();Date(inty);

voidshowDate();

private:

intyear,month,day;};构造函数的重载一个类中可以定义多个参数个数或参数类型不同的构造函数。11ppt课件voidmain(){

Datedate1(2008,8,8);Datedate2;Datedate3(2008);cout<<"Date1output1:"<<endl;date1.showDate();cout<<"Date2output2:"<<endl;date2.showDate();cout<<"Date3output3:"<<endl;date3.showDate();}构造函数的重载12ppt课件说明:构造函数允许被重载对象定义时,只能有一个构造函数起作用使用无参构造函数创建对象时不用加()重载构造函数时应避免二义性构造函数的重载练习:仿照上例,编写coord类的构造函数13ppt课件程序中是否可没有构造函数14ppt课件Date::Date(){}没有显式定义构造函数时,系统默认提供的(另有一种说法是某些情况下才提供默认构造函数)默认构造函数不进行变量初始化定义对象时,不需要()一旦定义了构造函数,就不再提供默认构造函数默认构造函数15ppt课件Date::Date

(inty,intm,intd){year=y;month=m;day=d;}Date::Date(inty){year=y;month=1;day=1;}

inline

voidDate::showDate(){cout<<year<<"."<<month<<"."<<day<<endl;}

#include<iostream>usingnamespacestd;

classDate{

public:Date(inty,intm,intd);Date(inty);

voidshowDate();

private:

int

year,month,day;};默认构造函数16ppt课件intmain(){

Datedate1(2008,8,8);

Datedate2;

Datedate3(2008);cout<<"Date1output1:"<<endl;date1.showDate();cout<<"Date2output2:"<<endl;date2.showDate();cout<<"Date3output3:"<<endl;date3.showDate();

return0;}默认构造函数17ppt课件Date::Date

(inty,intm,intd){year=y;month=m;day=d;}

inline

voidDate::showDate(){cout<<year<<"."<<month<<"."<<day<<endl;}

#include<iostream>usingnamespacestd;

classDate{

public:Date(inty=2001,intm=1,intd=1);

voidshowDate();

private:

int

year,month,day;};带缺省参数的构造函数Date::Date

(inty,intm,intd){year=y;month=m;day=d;}

inline

voidDate::showDate(){cout<<year<<"."<<month<<"."<<day<<endl;}

#include<iostream>usingnamespacestd;

classDate{

public:Date(inty=2001,intm=1,intd=1);

voidshowDate();

private:

int

year,month,day;};18ppt课件intmain(){

Datedate1(2008,8,8);

Datedate2;

Datedate3(2008);cout<<"Date1output1:"<<endl;date1.showDate();cout<<"Date2output2:"<<endl;date2.showDate();cout<<"Date3output3:"<<endl;date3.showDate();

return0;}带缺省参数的构造函数19ppt课件说明构造函数在类外定义,则默认参数应该在类的声明构造函数原型时指定,而不能在类外定义时指定部分给默认参数,取默认值的参数必须在参数右边。

Date(inty=2012,intm,int);Dated(6,6);调用时,若一个参数省略,则其后参数必须全省略

Date(inty,intm=1,intn=1);

Dated(2012,,6)一个类中定义了全部是默认参数的构造函数后,不能再定义重载构造函数。(二义性)

Date();Date(inty=0,intm=0,intd=0)练习:用带默认参数的形式,编写Coord类的构造函数20ppt课件成员初始化表带有成员初始化表的构造函数的一般形式如下:

类名::构造函数名([参数表])[:(成员初始化表)]

{//构造函数体

}成员初始化表的一般形式为:

数据成员名1(初始值1),数据成员名2(初始值2),……

21ppt课件成员初始化表Date::Date

(inty,intm,intd):year(y),month(m),day(d){}

inline

voidDate::showDate(){cout<<year<<"."<<month<<"."<<day<<endl;}

#include<iostream>usingnamespacestd;

classDate{

public:Date(inty,intm,intd);

voidshowDate();

private:

int

year,month,day;};22ppt课件

#include<iostream>usingnamespacestd;

classA{

public: A(intx1):x(x1),rx(x),pi(3.14)//rx(x)相当于rx=x, {}//pi(3.14)相当于pi=3.14

void

print() {cout<<"x="<<x<<""<<"rx="<<rx<<""<<"pi="<<pi;}

private:

intx,rx;const

floatpi;};成员初始化表23ppt课件注意若要将数据成员存放在堆或数组中,则应在构造函数中进行赋值,不能使用成员初始化表。

classStudent{ stringname; intage; int*score; intcourseNum;public: Student(stringn,inta,intcn); voidshowStudent();};24ppt课件Student::Student(stringn,inta,intcn):name(n),age(a),courseNum(cn){ score=newint[courseNum]; for(inti=0;i<courseNum;i++) cin>>score[i];}25ppt课件

2.类成员按它们在类里被声明的顺序进行初始化,与其在成员初始化表中列出的顺序无关。#include

<iostream>usingnamespacestd;classTest{public: Test(int

m):k(m),i(k+2){}

voidShow(){cout<<i<<endl<<k;}private:

inti;intk;};voidmain(){

Testt1(6); t1.Show();}

注意26ppt课件成员初始化表设计Box类,计算盒子体积。用以下三种方式初始化Box类:带参构造函数,接收参数分别给长宽高赋值默认构造函数,使得长宽高初始化为(10,10,10)带默认参数的构造函数,使不提供参数时长宽高初始化为(1,1,1)成员初始化表完成长宽高的初始化写出Salary类的构造函数1.通常,在构造函数中只做简单初始化,不写复杂程序2.构造函数中用new分配的存储空间,怎么收回?27ppt课件析构函数析构函数的功能:撤消对象时的清理,如释放分配给对象的内存空间等。析构函数的特点: (1)析构函数与构造函数名字相同,但它前面必须加一个波浪号(~); (2)析构函数没有参数,也没有返回值,而且不能重载。因此在一个类中只能有一个析构函数; (3)当撤消对象时,编译系统会自动地调用析构函数。28ppt课件#include<iostream.h>classDate{

public: Date(inty,intm,intd);//构造函数

~Date();//析构函数

void

showDate();

private:

int

year,month,day;};Date::Date(inty,intm,intd)//构造函数的实现{ cout<<“创建……"<<endl; year=y;month=m;day=d;}析构函数29ppt课件Date::~Date()//析构函数的实现{cout<<“销毁……"<<endl; }voidDate::showDate(){cout<<year<<"."<<month<<"."<<day<<endl;}void

main(){Datedate1(1998,4,28);cout<<"Date1output1:"<<endl;date1.showDate();}析构函数30ppt课件若一个对象在完成其操作之前需要做一些内部处理(如释放由new动态分配的空间),则需要显示定义析构函数。 classstr {

char

*s;

intmax_len; public: str(char*){s=new

char[max_len];} ~str(){delete[]s;} };析构函数模拟上例完成Salary类的析构函数31ppt课件一个对象生命期结束时,该对象的析构函数被自动调用。如,函数内的局部对象

析构函数的调用时机voidfun(){cout<<“infun….”<<endl;Dated(2001,5,6);d.showDate();}voidmain(){cout<<“inmain…..”<<endl;fun();cout<<‘”outoffun…”<<endl;}32ppt课件全局对象(在函数外定义的对象)当main函数结束或执行exit命令时自动执行析构函数释放对象。析构函数的调用时机Dated(2001,5,6);voidfun(){cout<<“infun….”<<endl;d.showDate();}voidmain(){cout<<“inmain…..”<<endl;fun();cout<<‘”outoffun…”<<endl;}33ppt课件析构函数调用顺序对象1的构造函数对象2的构造函数对象3的构造函数对象1的析构函数对象2的析构函数对象3的析构函数当有多个对象时,先构造的后析构34ppt课件析构函数调用顺序#include<iostream>using

namespacestd;classStudent{

intID;

floatscore;public:Student(intid,floats);~Student();};Student::Student(intid,floats):ID(id),score(s){cout<<"hello

"<<ID<<endl;}Student::~Student(){cout<<"bye

"<<ID<<endl;}intmain(){Students1(101,80.5)Students1(102,70.5);}35ppt课件静态局部对象,则在第一次调用该函数建立对象时调用构造函数,但要在主函数结束才调用析构函数。

voidfn() { studentst1;//定义局部自动对象

staticstudentst2;//定义静态局部对象

… }

析构函数调用顺序36ppt课件对象数组所谓对象数组是指每一数组元素都是对象的数组,。定义一个一维对象数组的格式如下:

类名数组名[下标表达式];

例如:

Students[10];对象数组中每个元素就是一个对象,通过对象可以访问类的公有成员。

数组名[下标].成员名37ppt课件 在建立数组时,同样要调用构造函数。上面的数组有50个元素,要调用50次构造函数。如果构造函数有多个参数,C++要求:在等号后的花括号中为每个对象分别写出构造函数并指定实参。格式为:

studentst[n]={student(实参1,实参2,实参3),

… student(实参1,实参2,实参3) };

对象数组38ppt课件析构函数调用顺序#include<iostream>using

namespacestd;classStudent{

intID;

floatscore;public:Student(intid,floats);~Student();};Student::Student(intid,floats):ID(id),score(s){cout<<"hello

"<<ID<<endl;}Student::~Student(){cout<<"bye

"<<ID<<endl;}intmain(){

studentstd[3]={ student(1001,87), student(1002,76), student(1003,80)};}39ppt课件

#include<iostream>

using

namespacestd;

classCat{

public: Cat(){age=10;}Cat(intn){age=n;} ~Cat(){cout<<"析构函数被调用"<<age<<endl;}

intget_age(){returnage;}private:

intage; };对象数组main(){Catob1[4];Catob2[4]={11,22,33,44};Catob3[4]={55,66};for(inti=0;i<4;i++)cout<<ob1[i].get_age()<<"";cout<<endl;for(inti=0;i<4;i++)cout<<ob2[i].get_age()<<"";cout<<endl;for(inti=0;i<4;i++)cout<<ob3[i].get_age()<<"";cout<<endl;return0;

}40ppt课件main(){Catob3[4]={Cat(11),Cat(22),Cat(33),Cat(44)};Catob4[4]={Cat(55),Cat(66)};inti;for(i=0;i<4;i++)cout<<ob3[i].get_age()<<"";cout<<endl;for(i=0;i<4;i++)cout<<ob4[i].get_age()<<"";cout<<endl;return0;

}对象数组41ppt课件对象指针1.用指针访问单个对象成员 声明对象指针的一般语法形式为:

类名*对象指针名;对象指针赋值:指针名=&对象名;

指向对象的指针来访问对象成员,

指针名->成员名或

(*指针名).成员名42ppt课件#include<iostream.h>classexe{public:

void

exe(inta){x=a;}voidshowA(){cout<<x<<endl;}private:intx;};

main() {exeob(2),*p;

ob.showA(); p=&ob; p->showA();

(*p).showA();

return0; }43ppt课件指向对象成员的指针

对象由成员组成。对象占据的内存区是各个数据成员占据的内存区的总和。对象成员也有地址,即指针。这指针分指向数据成员的指针和指向成员函数的指针。44ppt课件1.指向对象公有数据成员的指针 ①定义数据成员的指针变量 数据类型*指针变量名 ②计算公有数据成员的地址

&对象名.成员名 这里的数据类型是数据成员的数据类型。 例:Timet1; int*p1;//定义一个指向整型数据的指针变量

p1=&t1.hour;//假定hour是公有成员

cout<<*p1<<endl;45ppt课件2.指向对象成员函数的指针

①定义指向成员函数的指针变量

数据类型

(类名::*变量名

)(形参表

);

数据类型是成员函数的类型。

类名是对象所属的类

变量名按标识符取名

形参表:指定成员函数的形参表(形参个数、类型) ②取成员函数的地址

&类名::成员函数名

46ppt课件 ③给指针变量赋初值 指针变量名=&类名::成员函数名; ④用指针变量调用成员函数

(对象名.*指针变量名)([实参表]);

对象名:是指定调用成员函数的对象。 *:明确其后的是一个指针变量。 实参表:与成员函数的形参表对应

47ppt课件

#include<iostream> usingnamespacestd; classTime {public: Time(int,int,int); inthour; intminute; intsec; voidget_time(); };例3.7有关对象指针的使用方法

Time::Time(inth,intm,ints) {hour=h; minute=m; sec=s; } voidTime::get_time() {cout<<hour<<":"<<minute<<":"<<sec<<endl;}48ppt课件intmain(){Timet1(10,13,56);int*p1=&t1.hour;//定义指向成员的指针p1cout<<*p1<<endl;t1.get_time();//调用成员函数

Time*p2=&t1;//定义指向对象t1的指针p2p2->get_time();//用对象指针调用成员函数

void(Time::*p3)();

//定义指向成员函数的指针

p3=&Time::get_time;

//给成员函数的指针赋值

(t1.*p3)();//用指向成员函数的指针调用成员函数

return0;}49ppt课件This指针classCoord{

private:

intx;

inty;

public:

Coord(intm,intn);

intshowXY(); };Coord::Coord(intm,intn){ x=m; y=n;}voidCoord::showXY(){cout<<x<<','<<y<<endl;}intmain(){Coordc1(3,5);Coordc2(8,8);c1.showXY();c2.showXY();return0;}程序如何知道该输出哪个值?50ppt课件this,其值是当前被调用的成员函数所在的对象的起始地址——this,指向当前对象的指针创建对象时this指针指向该对象;this指针是作为隐含的参数在调用对象的函数时传递给该函数。可以用它来确定函数访问的是哪一个对象的数据成员This指针51ppt课件this指针引例voidCoord::showXY(Coord*this){cout<<this->x<<','<<this->y<<endl;}intmain(){Coordc1(3,5);Coordc2(8,8);c1.showXY(&c1);c2.showXY(&c2);return0;}52ppt课件使用this应注意的问题this的作用域仅在一个对象内部。例如,在类外的语句:

Aa;

a.this;

错误在对象内部,this指针是一个const指针。例如:

this=&p;

错误53ppt课件#include<iostream.h>classexample{public: example(intn,intm) {x=n;y=m;}

intgetX() {returnx;}

intgetY() {returny;}private:

intx,y;};用对象指针访问对象数组54ppt课件main() {inti;

exampleop[4]={example(1,2),example(3,4),example(5,6),example(7,8)};}

example*p; p=&op[3]; for(i=0;i<4;i++) {cout<<p->getX()<<'';cout<<p->getY()<<"\n";p--; } cout<<"\n";

return0;}用对象指针访问对象数组55ppt课件用对象指针访问对象数组设计一个学生类Student,包括学号(num)和成绩(score)。建立一个对象数组,通过初始化,设置5个学生的数据,要求:用指针指向数组首元素,输出第1、3、5个学生的信息;56ppt课件对象指针做函数参数 引例:设计Person类有age和wage两个数据成员,构造函数、显示函数、获取年龄的getAge函数、addWage函数增加工资。(1)编写函数比较两个人的年龄

对象做函数参数:形参对象分配空间,复制数据成员,效率低对象指针做函数参数:只需分配指针空间

(2)编写函数调用addWage修改工资

对象做函数参数:无法完成对对象的修改

对象指针做函数参数:可以完成对象修改57ppt课件用对象指针访问对象数组设计一个学生类Student,包括学号(num)和成绩(score)。建立一个对象数组,通过初始化,设置5个学生的数据,要求:定义函数找出成绩最高者,返回其学号58ppt课件引用引用通常被认为是某个变量的别名

数据类型

&引用名

=已定义的变量名;

例如:inti=5;int&j=i;j并没有重新在内存中开辟单元,只是引用i的单元i与j在内存中占用同一地址,即同一地址两个名字对引用的操作实际就是对引用目标的操作引用在定义的时候要初始化59ppt课件引用指针与引用的区别:指针是通过地址间接访问某个变量,而引用是通过别名直接访问某个变量引用必须初始化,而一旦被初始化后不得再作为其它变量的别名60ppt课件对象引用intmain(){ Personmike(30,2000); Person&miky=mike; miky.show();mike.show();

return0;}61ppt课件对象引用做函数参数 例子:修改上例的两个函数,用对象引用做函数参数,观察程序运行结果

考虑:用引用做函数参数的优势在哪里62ppt课件利用构造函数创建对象时,通过指针和new来实现。其一般语法形式为:

类名*指针变量=new类名[(实参表)];

例如:

Date*date1=newDate(2007,9,18);就创建了对象(*date1)。用new定义对象63ppt课件说明new创建类对象需要指针接收,一处初始化,多处使用new创建类对象使用完需delete销毁

64ppt课件如果有对话框类CMyDlg;fun(){CMyDlgdlg;dlg.create();.......}建一非模式对话框,函数一结束,dlg被收回了,这个对话框一闪而过。CMyDlg*dlg=newCMyDlg;dlg->create();说明函数结束了,dlg还在。这个非模式对话框还在65ppt课件new创建类对象需要指针接收,一处初始化,多处使用new创建类对象使用完需delete销毁new创建对象直接使用堆空间,而不用new定义类对象则使用栈空间new对象指针用途广泛,比如作为函数返回值、函数参数等说明66ppt课件共用数据的保护如果即希望数据在一定范围内共享,又不愿它被随意修改,从技术上可以把数据指定为只读型的。C++提供const手段,将数据、对象、成员函数指定为常量,从而实现了只读要求,达到保护数据的目的。67ppt课件常类型目的:为了保证数据共享又防止数据被改动。const类型修饰符常类型的变量或者是对象成员的值在程序运行期间都是不可以改变的。68ppt课件

常对象定义格式:类名const对象名[(参数表)];或

const类名对象名[(参数表)];常对象在定义时必须初始化,而且不能被更新69ppt课件是否有错?#include<iostream.h>classA{public:

intm; A(

inti,

intj) {m=i;n=j;}

voidsetvalue(inti)

{n=i;}

voiddisply()

{cout<<"m="<<m<<endl;

cout<<"n="<<n<<endl;

}private:

intn;};voidmain(){Aa(10,20);

a.setvalue(40);a.m=30;a.disply();}constAa(10,20);注意:不允许直接或间接更改常对象的数据成员;不允许常对象调用普通的成员函数70ppt课件 如果在常对象中要修改某个数据成员,C++提供了指定可变的数据成员方法。

格式:mutable类型数据成员; 在定义数据成员时加mutable后,将数据成员声明为可变的数据成员,就可以用声明为const的成员函数修改它的值。

常对象71ppt课件常对象成员类的数据成员可以是常量或常引用。常数据成员只能通过构造函数初始化列表进行初始化。

#include<iostream.h>

classDate{

public: Date(

inty,

intm,

intd);

voidshowDate();

private:

const

intyear,month,day;};72ppt课件Date::Date(inty,intm,intd):year(y),month(m),day(d),r(year){}voidDate::showDate(){cout<<year<<"."<<month<<"."<<day<<endl;}

voidmain(){Datedate1(1998,4,28);date1.showDate();}注意:year,month,day初始化后不允许被修改73ppt课件常成员函数类型函数名(参数表)const;classDate{public: Date(inty,intm,intd):year(y),month(m),day(d){} voidshowDate();

voidshowDate()const;private:intyear,month,day;};voidDate::showDate(){cout<<"ShowDate1;"<<endl;cout<<year<<"."<<month<<"."<<day<<endl;}74ppt课件voidDate::showDate()const{cout<<"ShowDate2;"<<endl;cout<<year<<"."<<month<<"."<<day<<endl;}voidmain(){Datedate1(1998,4,28);date1.showDate();constDatedate2(2002,11,14);

date2.showDate();}75ppt课件注意:在函数的实现部分也要带上关键字constconst可以用于函数重载常对象只能调用常成员函数,不能调用普通的成员函数。常成员函数不能更新对象的数据成员,也不能调用该类中的普通的成员函数。76ppt课件常指针将指针变量声明为const型,指针值始终保持为其初值,不能改变。一般形式为类型*const指针变量名;

intm=1,n=2;

int*constptr1=&m;

//ptr1是常指针

ptr1=&n;

//错误,ptr1应始终指向同一个变量

*ptr1=100;//ptr1所指向的变量值可以改变常见用途:将常指针作为函数的形参,目的是不允许在函数执行过程中改变指针变量的值,使其始终指向原来的对象。指针值不可变,

指针指向的值是否可变,取决于指向的对象。77ppt课件指向常对象的指针常对象,只能用指向常对象的指针变量指向它;指向常对象的指针变量,可以指向非const的对象,但不能通过指针来改变其指向的对象;当希望在调用函数时对象的值不被修改,就应当把形参定义为指向常对象的指针变量,同时用对象的地址作实参(对象可以是const或非const型)。指向常对象的指针变量constTime*ptr;

指针变量的指向可变,指针指向的对象不可改变。78ppt课件对象的常引用 如果用引用形参又不想让函数修改实参,可以使用常引用机制。 格式:const类名&形参对象名79ppt课件#include<iostream>usingnamespacestd;classTime{public:Time(int,int,int);inthour;intminute;intsec;};

例3.8对象的引用Time::Time(inth,intm,ints){hour=h;minute=m;sec=s;}voidfun(Time&t){t.hour=18;}intmain(){Timet1(10,13,56);fun(t1);cout<<t1.hour<<endl;return0;}如果用引用形参又不想让函数修改实参,可以使用常引用机制80ppt课件对象的赋值和拷贝1.变量赋值

inta=2,b;b=a;2.对象赋值:同种类型的对象

对象1=对象2;

对象1的成员对象2的成员81ppt课件说明使用对象赋值语句时,对象的类型必须相同。两个对象之间的赋值,仅仅使得这些对象的数据成员的值是相同的。两个对象自身还是分离的。将一个对象的值赋值给另外一个对象时,大多数情况下都是成功的。但是当类中存在指针时,可能会产生错误例:testCopy.txt82ppt课件classDate{

intyear,month,day;public: Date(inty=2001,intm=1,intd=1):year(y),month(m),day(d){}

voidshowDate();};inline

voidDate::showDate(){cout<<year<<','<<month<<','<<day<<endl;}intmain(){Dated1(1998,2,2);

Dated2=d1;//Dated2(d1); d2.showDate();

return0;}83ppt课件拷贝构造函数拷贝构造函数是一种特殊的构造函数,其形参是本类对象的引用。其作用是使用一个已经存在的对象去初始化另一个同类的对象。Date::Date(constDate&d){year=d.year;month=d.month;day=d.day;}84ppt课件拷贝构造函数具有以下特点:函数名与类名相同;没有返回值类型;只有一个参数,并且是同类对象的别名;每个类都必须有一个拷贝构造函数;程序员可以自定义拷贝构造函数,也可以使用缺省的拷贝构造函数。拷贝构造函数85ppt课件默认的拷贝构造函数如果没有编写自定义的拷贝构造函数,C++会自动地将一个已存在的对象复制给新对象,这种按成员逐一复制的过程由是缺省拷贝构造函数自动完成的。Date::Date(constDate&d){year=d.year;month=d.month;day=d.day;}86ppt课件自定义拷贝构造函数自定义拷贝构造函数的一般形式如下:

类名::类名(const类名&对象名)

{ //拷贝构造函数的函数体

}例:编写Date类的自定义拷贝构造函数,使得新对象成员是已有对象成员年份加1练习:编写Coord类的自定义拷贝构造函数,使得新对象成员是已有对象成员的2倍87ppt课件调用拷贝构造函数的三种情况:当用类的一个对象去初始化该类的另一个对象时: Dated2(d1);//用对象d1初始化对象d2,//拷贝构造函数被调用(代入法) Dated3=d1;//用对象d1初始化对象d3,//拷贝构造函数被调用(赋值法)

上述两个语句被执行时需要调用拷贝构造函数。拷贝构造函数88ppt课件当函数的形参是类的对象,调用函数,进行形参和实参结合时。

fun1(Dated)

//函数的形参是类的对象

{d.showDate();}main(){Dated1(1998,1,1);

fun1(d1);

//当调用函数,进行形参和实参结合时,//调用拷贝构造函数

return0;}拷贝构造函数89ppt课件当函数的返回值是对象,函数执行完成,返回调用者时。例如:Datefun2(){Dated1(2001,1,1);

returnd1;//函数的返回值是对象}voidmain(){Dated2;d2=fun2();//函数执行完成,返回调用者时,}拷贝构造函数90ppt课件静态数据成员问题:希望在同类的多个对象之间共享一个或多个数据。

例:Student类加入count成员变量,记录共创建了多少个该 类对象,从而获取学生个数。

stuCount.txt解决:定义静态数据成员91ppt课件静态数据成员定义静态数据成员的格式如下:

static

数据类型数据成员名;

例如:

static

intcount;数据成员1数据成员2........数据成员n对象1数据成员1数据成员2........数据成员n对象2静态数据成员92ppt课件说明静态数据成员初始化需要在类外单独进行。

数据类型类名::静态数据成员名=值;静态数据成员和静态变量一样,是在编译时创建并初始化静态数据成员在所有对象之外单独开辟空间所占空间不随某个对象的撤销而释放静态数据成员属于类。访问public静态数据成员时可以用

类名::静态数据成员名private静态数据成员,类外需要通过公有成员函数访问93ppt课件静态成员函数定义静态成员函数的格式如下:

static

返回类型

静态成员函数名(参数表);调用公有静态成员函数的一般格式有如下几种:

类名::静态成员函数名(实参表)

对象.静态成员函数名(实参表)

对象指针->静态成员函数名(实参表)练习:修改student类,增加sum数据成员记录学生成绩和增加total和average函数分别完成成绩求和及平均值94ppt课件说明一般情况下,静态成员函数主要用来访问全局变量或同类中的静态数据成员。达到对象间数据共享。因静态成员函数不含this指针,所以,静态成员函数不访问类中的非静态成员。若要访问非静态对象必须通过对象(或对象指针)来访问95ppt课件静态成员访问非静态数据成员#include<iostream.h>classsmall_cat{public: small_cat(doublew);

staticvoiddisplay(small_cat&w);

staticvoidtotal_display();private: doubleweight; staticdoubletotal_weight; staticdoubletotal_number;};96ppt课件small_cat::small_cat(doublew){weight=w;total_weight+=w;total_number++; }voidsmall_cat::display(small_cat&w){cout<<"小猫的重量是"<<w.weight<<endl; }voidsmall_cat::total_display(){cout<<total_number<<"小猫的重量是"; cout<<total_weight<<"kg"<<endl; }97ppt课件doublesmall_cat::total_number=0;doublesmall_cat::total_weight=0;intmain(){ small_catw1(0.9),w2(0.8),w3(0.7); small_cat::display(w1); small_cat::display(w2); small_cat::display(w3); small_cat::total_display(); return0;}98ppt课件友元classPoint{private:doublex,y;public:Point(intm=0,intn=0):x(m),y(n){}voidshowXY();};voidPoint::showXY(){cout<<x<<','<<y<<endl;}问题:编写函数计算两点的距离doubledistance(Point&p1,Point&p2)困难:需要使用p1,p2的x,y值解决:友元函数,可访问私有成员99ppt课件友元函数友元函数不是当前类的成员函数,而是独立于当前类的外部函数,但它可以访问该类的所有对象的成员,包括私有成员、保护成员和公有成员。在类中声明友元函数

friend

函数原型;例:pointDis.txt100ppt课件友元成员函数一个类的成员函数也可以作为另一个类的友元1定义Time类,三个私有数据成员hour,min,sec,成员函数有构造函数,showTime显示时间函数2定义Date类,三个私有数据成员year,month,day,成员函数有构造函数,showDate显示日期函数3在showTime中添加日期显示

timeDate.cpp101ppt课件一个类的成员函数作为另一个类的友元函数时,必须先定义这个类。前向声明的使用。classDate;需小心排列各种声明和定义的顺序。注意102ppt课件友元类一个类也可以作为另一个类的友元。例如:

classY{//…};

classX{//…

friendY; //…};类Y的所有成员函数都为X的友元函数。103ppt课件classStudent; //前向声明,类名声明classTeacher {privated: intnoOfStudents; Student*pList[100];public: voidassignGrades(Student&s); //赋成绩

voidadjustHours(Student&s); //调整学时数};classStudent{privated: intHours; floatgpa;public:

friendclassTeacher;

};voidTeacher::assignGrades(Student&s){…};voidTeacher::adjustHours(Student&s){…};通过传递参数可以实现对类Student所有成员的操作函数定义必须在类Student定义之后104ppt课件友元使用说明友元关系是单向的友元关系不能传递友元提供了一种数据共享的机制对类封装的破坏。应该慎重、合理的使用友元105ppt课件类模板

对于功能相同而只是数据类型不同的函数,不必须定义出所有函数,我们定义一个可对任何类型变量操作的函数模板。对于功能相同的类而数据类型不同,不必定义出所有类,只要定义一个可对任何类进行操作的类模板。 例如定义比较两个整数的类和比较两个浮点数的类,这两个类做的工作是相似的所以可以用类模板,减少工作量。106ppt课件classCompare_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论