面向对象程序设计-6_第1页
面向对象程序设计-6_第2页
面向对象程序设计-6_第3页
面向对象程序设计-6_第4页
面向对象程序设计-6_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

面向对象程序设计(C++)第6讲

C++程序结构习题讲解4-194-203本章主要内容作用域与可见性对象的生存期数据与函数静态成员共享数据的保护友元编译预处理命令多文件结构和工程深度探索4函数原形的作用域函数原型中的参数,其作用域始于

"(",结束于")"。例如,设有下列原型声明:doublearea(doubleradius);radius的作用域仅在于此,不能用于程序正文其他地方,因而可有可无。作用域与可见性5局部作用域函数的形参,在块中声明的标识符,其作用域自声明处起,限于块中,例如:voidfun(inta){intb=a;cin>>b;if(b>0){intc;......}}c的作用域b的作用域作用域与可见性a的作用域6类作用域类作用域作用于特定的成员名。类X的成员m具有类作用域,对m的访问方式如下:如果在X的成员函数中没有声明同名的局部作用域标识符,那么在该函数内可以访问成员m。通过表达式x.m或者X::m访问。通过表达式ptr->M作用域与可见性7命名空间命名空间可以解决类名、函数名等的命名冲突命名空间的声明namespace命名空间名{

各种声明(函数声明、类声明、……)}例namespaceSomeNs

{ classSomeClass{...};}特殊的命名空间全局命名空间:默认的命名空间匿名命名空间:对每个源文件是唯一的(注意其作用)作用域与可见性命名空间作用域一个命名空间确定了一个命名空间作用域引用其它命名空间作用域中的标识符命名空间名::标识符名例:声明一个SomeClass型的对象SomeNs::SomeClassobj1;将其它命名空间作用域的标识符暴露于当前作用域对指定标识符using命名空间名::标识符名;对所有标识符usingnamespace命名空间名;8作用域与可见性9可见性可见性是从对标识符的引用的角度来谈的概念可见性表示从内层作用域向外层作用域“看”时能看见什么。如果标识在某处可见,则就可以在该处引用此标识符。块作用域类作用域命名空间作用域作用域与可见性10可见性标识符应声明在先,引用在后。如果某个标识符在外层中声明,且在内层中没有同一标识符的声明,则该标识符在内层可见。对于两个嵌套的作用域,如果在内层作用域内声明了与外层作用域中同名的标识符,则外层作用域的标识符在内层不可见。作用域与可见性11同一作用域中的同名标识符在同一作用域内的对象名、函数名、枚举常量名会隐藏同名的类名或枚举类型名。重载的函数可以有相同的函数名。作用域与可见性12#include<iostream>usingnamespacestd;inti; //在全局命名空间中的全局变量namespaceNs{ intj; //在Ns命名空间中的全局变量}intmain(){ i=5; //为全局变量i赋值

Ns::j=6; //为全局变量j赋值

{ //子块1 usingnamespaceNs;//当前块中可以直接引用Ns中的标识符

inti; //局部变量,局部作用域

i=7; cout<<"i="<<i<<endl;//输出7 cout<<"j="<<j<<endl;//输出6 } cout<<"i="<<i<<endl; //输出5 return0;}作用域与可见性例5.113对象的生存期对象从产生到结束的这段时间就是它的生存期。在对象生存期内,对象将保持它的值,直到被更新为止。14静态生存期这种生存期与程序的运行期相同。在文件作用域中声明的对象具有这种生存期。在函数内部声明静态生存期对象,要冠以关键字static

。只生成一次,只初始化一次对象的生存期voidfun(){ staticintk=10;

k++; cout<<k<<endl;}voidfun(){ staticintk; k=10; k++; cout<<k<<endl;}结果一样吗?voidmain(){

for(intI=0;I<10;I++) fun();

}15#include<iostream>usingnamespacestd;inti=5;//文件作用域intmain(){cout<<"i="<<i<<endl;return0;}i具有静态生存期对象的生存期例16动态生存期块作用域中声明的,没有用static修是的对象是动态生存期的对象(习惯称局部生存期对象)。开始于程序执行到声明点时,结束于命名该标识符的作用域结束处。对象的生存期17#include<iostream>usingnamespacestd;voidfun();intmain(){fun();fun();}voidfun(){

staticinta=1;inti=5;

a++;

i++;cout<<"i="<<i<<",a="<<a<<endl;}运行结果:i=6,a=2i=6,a=3i是动态生存期a是静态生存期对象的生存期例变量类型总结19例5-2变量的生存期与可见性#include<iostream>usingnamespacestd;inti=1;//i为全局变量,具有静态生存期。voidother(){staticinta=2;staticintb;//a,b为静态局部变量,具有全局寿命,局部可见。

//只第一次进入函数时被初始化。

intc=10;//C为局部变量,具有动态生存期,

//每次进入函数时都初始化。

a+=

2;i+=

32;c+=

5;cout<<"---OTHER---\n";cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl;

b=a;}对象的生存期intmain(){staticinta;//静态局部变量,有全局寿命,局部可见。

intb=-10;//b,c为局部变量,具有动态生存期。

intc=0; cout<<"---MAIN---\n";cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl;c+=8;other();cout<<"---MAIN---\n";cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl;

i+=

10;other(); return0;}17运行结果:---MAIN---

i:1

a:0b:-10c:0---OTHER---

i:33

a:4b:0c:15---MAIN---

i:33

a:0b:-10c:8---OTHER---

i:75

a:6b:4c:151822例5-3具有静态、动态生存期对象的时钟程序#include<iostream>usingnamespacestd;classClock{ //时钟类定义public: //外部接口

Clock(); voidsetTime(intnewH,intnewM,intnewS);//三个形参均具有函数原型作用域

voidshowTime();private: //私有数据成员

inthour,minute,second;};对象的生存期Clock::Clock():hour(0),minute(0),second(0){} //构造函数voidClock::setTime(intnewH,intnewM,intnewS){//三个形参均具有局部作用域

hour=newH; minute=newM; second=newS;}voidClock::showTime(){ cout<<hour<<":"<<minute<<":"<<second<<endl;}20ClockglobClock;//声明对象globClock,

//具有静态生存期,文件作用域intmain(){//主函数 cout<<"Firsttimeoutput:"<<endl;

//引用具有文件作用域的对象:

globClock.showTime();//对象的成员函数具有类作用域

globClock.setTime(8,30,30); ClockmyClock(globClock);

//声明具有块作用域的对象myClock cout<<"Secondtimeoutput:"<<endl;

myClock.showTime(); //引用具有块作用域的对象 return0;}21程序的运行结果为:Firsttimeoutput:0:0:0Secondtimeoutput:8:30:302226数据与函数数据存储在局部对象中,通过参数传递实现共享——函数间的参数传递。数据存储在全局对象中。将数据和使用数据的函数封装在类中。数据与函数27使用全局对象#include<iostream>usingnamespacestd;intglobal;voidf(){global=5;}voidg(){cout<<global<<endl;}intmain(){f();g();//输出“5”return0;}数据与函数28将函数与数据封装#include<iostream>usingnamespacestd;classApplication{public:voidf();voidg();private:intglobal;};voidApplication::f(){

global=5;}voidApplication::g(){cout<<global<<endl;}intmain(){ApplicationMyApp;MyApp.f();MyApp.g();return0;}数据与函数29静态成员静态数据成员用关键字static声明该类的所有对象维护该成员的同一个拷贝必须在类外定义和初始化,用(::)来指明所属的类。静态成员函数类外代码可以使用类名和作用域操作符来调用静态成员函数。静态成员函数只能引用属于该类的静态数据成员或静态成员函数。静态成员30例5-4

具有静态数据成员的Point类#include<iostream>usingnamespacestd;classPoint {public: Point(intx=0,inty=0):x(x),y(y){count++;} Point(Point&p); intgetX(){returnx;} intgetY(){returny;} voidshowCount(){ cout<<"Objectcount=“<<count<<endl;}private: intx,y;

staticintcount;};静态成员Point::Point(Point&p){ x=p.x; x=p.y; count++;}intPoint::count=0;intmain(){ Pointa(4,5); cout<<"PointA:"<<a.getX()<<","<<a.getY(); a.showCount(); Pointb(a); cout<<"PointB:"<<b.getX()<<","<<b.getY(); b.showCount(); return0;}2832静态成员函数举例#include<iostream>usingnamespacestd;classApplication{public:staticvoidf();staticvoidg();private:staticintglobal;};intApplication::global=0;voidApplication::f(){ global=5;}voidApplication::g(){ cout<<global<<endl;}intmain(){ Application::f(); Application::g(); return0;}静态成员33静态成员函数举例classA{public: staticvoidf(Aa);private: intx;};voidA::f(Aa){ cout<<x;//对x的引用是错误的 cout<<a.x;//正确}静态成员34具有静态数据、函数成员的Point类#include<iostream>usingnamespace

温馨提示

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

评论

0/150

提交评论