3-1 常成员函数、静态成员_第1页
3-1 常成员函数、静态成员_第2页
3-1 常成员函数、静态成员_第3页
3-1 常成员函数、静态成员_第4页
3-1 常成员函数、静态成员_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

常成员函数及静态成员获取vs改变对象的状态在程序运行的不同时刻,一个对象可能会处于不同的状态:对象的状态由对象的数据成员的值来体现。可以把类中的成员函数分成两类:获取对象状态(不改变数据成员的值)改变对象状态(改变数据成员的值)例如classDate{ public: voidset(inty,intm,intd);//改变对象状态

intget_day();//获取对象状态

intget_month();//获取对象状态

intget_year();//获取对象状态

......};为了防止在一个获取对象状态的成员函数中无意中修改对象数据成员的值,可以把它说明成常成员函数。例如,classDate{ public: voidset(inty,intm,intd);

intget_day()const;//常成员函数

intget_month()const;//常成员函数

intget_year()const;//常成员函数

......};voidDate::set(inty,intm,intd){year=y;month=m;day=d;}intDate::get_day()const{returnday;}intDate::get_month()const{returnmonth;}intDate::get_year()const{returnyear;}编译器一旦发现在常成员函数中修改数据成员的值,将会报错!常成员函数注意:对于有些修改对象状态的常成员函数,编译程序不会指出错误!classA{ intx; char*p; public: ...... voidf()const

{x=10;//Error p=newchar[20];//Error

strcpy(p,"ABCD");//因为没有改变p的值,

//编译程序认为OK! }};常成员函数还有一个作用:指出对常量对象能实施哪些操作,即,对常量对象只能调用类中的常成员函数。例如:classDate{public:voidset(inty,intm,intd);intget_day()const;intget_month()const;intget_year()const;

......};voidf(constDate&d)//d引用的是个常量对象!{...d.get_day()...//OK...d.get_month()...//OK...d.get_year()...//OKd.set(2011,3,23);//Error}同类对象如何共享数据?方案一:采用全局变量来表示共享数据。例如:intx=0;//全局变量classA{inty;

......voidf(){y=x;x++;......}//访问共享的x}a,b;//以下操作对同一个x进行a.f();b.f();共享的数据与对象之间缺乏显式的联系数据缺乏保护!x++;//不通过A类对象也能访问x,不安全!方案二:采用静态数据成员可以更好地实现同一个类的不同对象之间的数据共享。例如classA{inty;

......

staticintx;//静态数据成员声明voidf(){y=x;x++;......}//访问共享的x};intA::x=0;//静态数据成员定义及初始化......Aa,b;a.f();b.f();//上述操作对同一个x进行x++;//Error,不通过A类对象不能访问x!静态数据成员

类的静态数据成员对该类的所有对象只有一个拷贝。例如,对于下面A类中的shared:classA{ intx,y;

staticintshared;

public: A(){x=y=0;} voidincrease_all(){x++;y++;shared++;} intsum_all()const{returnx+y+shared;} ......};intA::shared=0;Aa1,a2;

shared:0a1 a2a1.x:0 a2.x:0a1.y:0 a2.y:0Aa1,a2;

shared:1a1 a2a1.x:1 a2.x:0a1.y:1 a2.y:0a1.increase_all();cout<<a2.sum_all()<<endl;//输出:1静态成员函数成员函数也可以声明成静态的(静态成员函数)。例如:classA{ intx,y; staticintshared; public: A(){x=y=0;}

staticintget_shared()//静态成员函数

{returnshared;

} ......};intA::shared=0;静态成员函数只能访问类的静态成员。静态成员函数没有隐藏的this参数!静态成员除了通过对象来访问外,也可以直接通过类来访问。例如:Aa;......cout<<a.get_shared();或者cout<<A::get_shared();classA{staticintobj_count;…...public:A()//在所有构造函数中增加:obj_count++;{obj_count++;......}~A()//在析构函数中增加:obj_count--;{obj_count--;......}staticintget_num_of_objects(){returnobj_count; }…...};intA::obj_count=0;......//其中创建了一系列A类对象cout<<A::get_num_of_

温馨提示

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

评论

0/150

提交评论