第八学时-类与对象优秀文档_第1页
第八学时-类与对象优秀文档_第2页
第八学时-类与对象优秀文档_第3页
第八学时-类与对象优秀文档_第4页
第八学时-类与对象优秀文档_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

第八讲静态及const成员类、对象和内存对象1对象2对象3数据1数据2数据1数据2数据1数据2函数1函数2静态成员数据3函数3公共成员

classX{charch;staticints;

…...};intX::s=0;XA,B,C,D;XB;charch; XC; charch;XD;charch;XA; charch;staticints;静态成员静态类成员数据静态数据成员的使用方法如下:1)静态数据成员的定义与一般数据成员相似,但前面要加上static关键词。2)静态数据成员的初始化与一般数据成员不同,静态数据成员初始化的格式如下:

<类型><类名>::<静态数据成员>=<值>;3)在引用静态数据成员时采用格式:

<类名>::<静态数据成员><对象名>.<静态数据成员>classA{…staticintvar;//在类的内部声明

…};intA::var=1;//在类的外部定义静态类成员数据静态和自动成员变量对象1对象2对象3automatic数据数据2数据1数据2数据1数据2静态数据数据4automatic数据数据1automatic数据数据3intsecond;调用静态成员函数的格式如下:静态成员函数不与某个具体的对象相联系,它是属于类的。staticints;如果一个成员函数只存取一个类的静态数据成员,可将该成员函数说明为静态成员函数.Time::Time(inth=0,intm=0,ints=0)用const声明的成员变量为常量成员变量~Counter(){num--;}return0;Time::Time(inth=0,intm=0,ints=0)Datedd(d1),automatic数据第八讲静态及const成员floatscore;gammag2,g3;Counterb;b.//例静态数据成员的说明和初始化

#include<iostream.h>classCounter{staticintnum;public:voidsetnum(inti){num=i;} voidshownum(){cout<<num<<'\t';}};intCounter::num=0;//公有、私有均需要初始化否则连接错误voidmain(){Countera,b;a.shownum();b.shownum();a.num=10;//Counter::num=10;cout<<Counter::num<<endl;}声明私有静态数据成员成员函数访问

静态数据成员调用成员函数访问

私有静态数据成员访问同一个

静态数据成员a.setnum(10);a.shownum();b.shownum();//例使用公有静态数据成员

#include<iostream.h>classcounter{public:voidsetnum(inti){num=i;}voidshownum(){cout<<num<<'\t';}

staticintnum;};intcounter::num=1; //初始值为1voidmain(){inti;for(i=0;i<5;i++){counter::num+=i;cout<<counter::num<<'\t';}cout<<endl;}访问公有静态数据成员

静态数据成员vs

全局变量

有了静态数据成员,各对象之间的数据有了沟通的渠道,实现数据共享。全局变量破坏了封装的原则,不符合面向对象程序的要求。公用静态数据成员与全局变量的作用域不同静态数据成员的作用域只限于定义该类的作用域内

静态类成员数据

静态成员函数的定义是在一般函数定义前加上static关键字。静态成员函数不与某个具体的对象相联系,它是属于类的。调用静态成员函数的格式如下:

<类名>::<静态成员函数名>(<参数表>);或

<对象名>.<静态成员函数名>(<参数表>);静态成员函数代码模拟-统计对象的数目#include<iostream.h>classCounter{staticintnum;public:

Counter(

){num++;}

~Counter(){num--;}voidsetnum(inti){num=i;} voidshownum(){cout<<num<<'\t';}

staticintget(){returnnum;}};intCounter::num=0; voidmain(){ Countera;a.shownum(); Counterb;b.shownum();

cout<<Counter::get()<<endl;}调用公有静态成员函数静态成员函数静态成员函数只能访问静态数据成员、静态成员函数和类以外的函数和数据,不能访问类中的非静态数据成员(因为非静态数据成员只有对象存在时才有意义)。但静态数据成员和静态成员函数可由任意访问权限许可的函数访问。和一般成员函数类似,静态成员函数也有访问限制,私有静态成员函数不能由外界访问。静态成员函数没有this指针,因此,静态成员函数只能直接访问类中的静态成员,若要访问类中的非静态成员时,必须借助对象名或指向对象的指针。

#include<iostream.h>classStudent{public:Student(intn,inta,floats):num(n),score(s){}voidtotal(){sum+=score;count++;}

staticfloataverage();//声明静态成员函数private:intnum;floatscore;

staticfloatsum;//静态数据成员

staticintcount;//静态数据成员};floatStudent::average()//定义静态成员函数{ return(sum/count);}代码模拟floatStudent::sum=0;//对静态数据成员初始化intStudent::count=0;//对静态数据成员初始化intmain(){ Studentstud[3]={Student(1001,18,70), Student(1002,19,78), Student(1005,20,98)}; for(inti=0;i<3;i++) stud[i].total(); cout<<"theaveragescoreofis" <<Student::average()<<endl; return0;}const与类const对象const成员变量const成员函数const与类1.const成员变量用const声明的成员变量为常量成员变量const成员变量只能由构造函数通过初始化列表对该数据成员进行初始化。

classTime{

public:

Time(inth=0,intm=0,ints=0);

voidsetTime(int,int,int);

intsetHour(int);

intgetHour();

intgetMinute();

voidprint();

private:

const

inthour;

//0-23

intminute;

//0-59

intsecond;

//0-59

};

const与类TimewakeUp(6,45,0);

wakeUp.setHour(20);

wakeUp.getHour();

wakeUp.print();

Time::

Time(inth=0,intm=0,ints=0):hour(h),minute(m),second(s){}Time::

Time(inth=0,intm=0,ints=0){hour=h;minute=m;second=s;}Time::

Time(inth=0,intm=0,ints=0):hour(h){minute=m;second=s;}const与类2.const成员函数使用const关键词说明的函数称为常量成员函数,说明格式如下:

<类型><函数名>(<参数表>)const;const成员函数的定义格式如下:<类型><函数名>(<参数表>)const{…...}若成员函数不修改对象,则声明为const.

const成员函数对于const成员函数需要注意以下几点:

1)const是函数类型的一个组成部分,因此在实现部分也要带const关键词。

2)常成员函数不更新对象的数据成员,也不能调用该类中非常成员函数。

3)const关键词可以参与区分重载函数。如果在类中有说明:

voidprint();

voidprint()const;

则这是对print的有效重载。const成员函数const与类3.const对象用const声明的对象称为常量对象。

const对象只能调用它的const成员函数,而不能调用其他成员函数。

constDated1;Date::Date(constDate&d);Datedd(d1),Student(1005,20,98)};shownum();b.Counter(){num++;}{hour=h;minute=m;second=s;}C.const数据成员只能由构造函数通过初始化列表对其进行初始化;charch;voidprint();和一般成员函数类似,静态成员函数也有访问限制,私有静态成员函数不能由外界访问。调用静态成员函数的格式如下:Date::Date(constDate&d);XA,B,C,D;voidg(){cout<<"asdf"<<endl;}XA,B,C,D;代码模拟-constclassTime{public: Time(inth=0,intm=0,ints=0) {hour=h;minute=m;second=s;} voidsetTime(inth,intm,ints) {hour=h;minute=m;second=s;}private: inthour; intminute; intsecond;};main(){ constTimet(20,20,20);

t.setTime(30,39,39); //error}#include<iostream.h>classA{public: A(intaa=0,intbb=0):a(aa),b(bb){} voidf()const{cout<<"1234"<<endl;}; voidg(){cout<<"asdf"<<endl;}private: inta; intb;};main(){ constAt; t.f(); //t.g(); error}代码练习根据要求,写出类main(){gammag1;gamma::showtotal();gammag2,g3;gamma::showtotal();g1.showid();g2.showid();g3.showid();cout<<"----------endofprogram----------\n";return0;}课后练习

生成一个SavingAccount类,用static数据成员包含每个存款人的annualInterestRate(年利率)。类的每个成员包含一个private数据成员savingsBalance,表示当前存款额。提供一个calculateMonthlyInterest成员函数,计算月利息,用banlance乘以annualInerestRate除以12取得,并将这个月息加进savingBalance中,提供一个static成员函数modifyInterestRate,将staticannualInterestRate设为新值。实例化两个不同的对象saver1和saver2,结余分别为和3000.0.将annualInterestRate设置为3%,计算每个存款人的月息并打印新的结果,然后将annualInterestRate设置为4%,再次打印。课后练习

设计一个集合类,包括将集合置空,添加元素,判断元素是否在集合中,输出集合,以及将集合中元素逆置,另外还有一个拷贝构造函数,并使用一些数据进行测试。{ constAt;用const声明的成员变量为常量成员变量Date::Date(constDate&d);shownum();b.XA,B,C,D;cout<<counter::num<<'\t';Counter(){num++;}voidsetnum(in

温馨提示

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

评论

0/150

提交评论