版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章C++程序的结构C++语言程序设计1本章主要内容作用域与可见性对象的生存期数据与函数静态成员共享数据的保护友元编译预处理命令多文件结构和工程2函数原形的作用域函数原型中的参数,其作用域始于
"(",结束于")"。例如,设有下列原型声明:doubleArea(doubleradius);radius的作用域仅在于此,不能用于程序正文其它地方,因而可有可无。作用域与可见性3类作用域类作用域作用于特定的成员名。类X的成员M具有类作用域,对M的访问方式如下:
如果在X的成员函数中没有声明同名的局部作用域标识符,那么在该函数内可以访问成员M。通过表达式x.M或者X::M访问。通过表达式prt->M作用域与可见性5文件作用域不在前述各个作用域中出现的声明,具有文件作用域,这样声明的标识符的作用域开始于声明点,结束于文件尾。作用域与可见性6可见性可见性是从对标识符的引用的角度来谈的概念可见性表示从内层作用域向外层作用域“看”时能看见什么。如果标识在某处可见,则就可以在该处引用此标识符。块作用域类作用域文件作用域作用域与可见性7同一作用域中的同名标识符在同一作用域内的对象名、函数名、枚举常量名会隐藏同名的类名或枚举类型名。重载的函数可以有相同的函数名。作用域与可见性9#include<iostream>usingnamespacestd;inti;//文件作用域intmain(){i=5;{inti;//块作用域
i=7;cout<<"i="<<i<<endl;//输出7}cout<<"i="<<i;//输出5return0;}作用域与可见性例5.110对象的生存期对象从产生到结束的这段时间就是它的生存期。在对象生存期内,对象将保持它的值,直到被更新为止。11#include<iostream>usingnamespacestd;inti=5;//文件作用域intmain(){cout<<"i="<<i<<endl;return0;}i具有静态生存期对象的生存期例13动态生存期块作用域中声明的,没有用static修是的对象是动态生存期的对象(习惯称局部生存期对象)。开始于程序执行到声明点时,结束于命名该标识符的作用域结束处。对象的生存期14#include<iostream>usingnamespacestd;voidfun();voidmain(){fun();fun();}voidfun(){staticinta=1;inti=5;
a++;
i++;cout<<"i="<<i<<",a="<<a<<endl;}运行结果:i=6,a=2i=6,a=3i是动态生存期a是静态生存期对象的生存期例15voidother(void){staticinta=2;staticintb;//a,b为静态局部变量,具有全局寿命,局部可见。//只第一次进入函数时被初始化。intc=10;//C为局部变量,具有动态生存期,//每次进入函数时都初始化。
a=a+2;i=i+32;c=c+5;cout<<"---OTHER---\n";cout<<"i:"<<i<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl;
b=a;}1717运行结果:---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:151818例5-3具有静态、动态生存期对象的时钟程序#include<iostream>usingnamespacestd;classClock //时钟类声明{public: //外部接口 Clock(); voidSetTime(intNewH,intNewM,intNewS);//三个形参均具有函数原型作用域 voidShowTime(); ~Clock(){}private: //私有数据成员 intHour,Minute,Second;};对象的生存期19ClockglobClock; //声明对象globClock,//具有静态生存期,文件作用域voidmain() //主函数{ cout<<"Firsttimeoutput:"<<endl;
//引用具有文件作用域的对象:
globClock.ShowTime();//对象的成员函数具有类作用域
globClock.SetTime(8,30,30); ClockmyClock(globClock);
//声明具有块作用域的对象myClock cout<<"Secondtimeoutput:"<<endl;
myClock.ShowTime(); //引用具有块作用域的对象}2121程序的运行结果为:Firsttimeoutput:0:0:0Secondtimeoutput:8:30:302222数据与函数数据存储在局部对象中,通过参数传递实现共享——函数间的参数传递。数据存储在全局对象中。将数据和使用数据的函数封装在类中。数据与函数23将函数与数据封装#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;}数据与函数25静态成员静态数据成员用关键字static声明该类的所有对象维护该成员的同一个拷贝必须在类外定义和初始化,用(::)来指明所属的类。静态成员函数类外代码可以使用类名和作用域操作符来调用静态成员函数。静态成员函数只能引用属于该类的静态数据成员或静态成员函数。静态成员26静态成员函数举例#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;}静态成员29静态成员函数举例classA{public:staticvoidf(Aa);private:intx;};voidA::f(Aa){cout<<x;//对x的引用是错误的cout<<a.x;//正确}静态成员30具有静态数据、函数成员的Point类#include<iostream>usingnamespacestd;classPoint //Point类声明{public: //外部接口 Point(intxx=0,intyy=0){X=xx;Y=yy;countP++;} Point(Point&p); //拷贝构造函数 intGetX(){returnX;} intGetY(){returnY;}
staticvoidGetC()
{cout<<"Objectid="<<countP<<endl;} private: //私有数据成员 intX,Y;
staticintcountP;}静态成员31Point::Point(Point&p){ X=p.X; Y=p.Y; countP++;}intPoint::countP=0;
voidmain() //主函数实现{ PointA(4,5); //声明对象A cout<<"PointA,"<<A.GetX()<<","<<A.GetY();
A.GetC(); //输出对象号,对象名引用 PointB(A); //声明对象B cout<<"PointB,"<<B.GetX()<<","<<B.GetY();
Point::GetC(); //输出对象号,类名引用}3232友元友元是C++提供的一种破坏数据封装和数据隐藏的机制。通过将一个模块声明为另一个模块的友元,一个模块能够引用到另一个模块中本是被隐藏的信息。可以使用友元函数和友元类。为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量不使用或少使用友元。友元33友元函数友元函数是在类声明中由关键字friend修饰说明的非成员函数,在它的函数体中能够通过对象名访问private和protected成员作用:增加灵活性,使程序员可以在封装和快速性方面做合理选择。访问对象中的成员必须通过对象名。友元34例5-6使用友元函数计算两点距离#include<iostream>#include<cmath>usingnamespacestd;classPoint //Point类声明{public: //外部接口 Point(intxx=0,intyy=0){X=xx;Y=yy;} intGetX(){returnX;} intGetY(){returnY;}
friendfloatDistance(Point&a,Point&b);
private: //私有数据成员 intX,Y;};友元35doubleDistance(Point&a,Point&b){doubledx=a.X-b.X;doubledy=a.Y-b.Y;returnsqrt(dx*dx+dy*dy);}intmain(){Pointp1(3.0,5.0),p2(4.0,6.0);doubled=Distance(p1,p2);cout<<"Thedistanceis"<<d<<endl;return0;}3636友元类若一个类为另一个类的友元,则此类的所有成员都能访问对方类的私有成员。声明语法:将友元类名在另一个类中使用friend修饰说明。友元37友元类举例classA{friendclassB;public:voidDisplay(){cout<<x<<endl;}private:intx;}classB{public:voidSet(inti);voidDisplay();private:
Aa;};友元38voidB::Set(inti){
a.x=i;}voidB::Display(){a.Display();}3939友元关系是单向的如果声明B类是A类的友元,B类的成员函数就可以访问A类的私有和保护数据,但A类的成员函数却不能访问B类的私有、保护数据。40常类型
常类型的对象必须进行初始化,而且不能被更新。常引用:被引用的对象不能被更新。const类型说明符&引用名常对象:必须进行初始化,不能被更新。类名const对象名常数组:数组元素不能被更新(下一章介绍)。类型说明符const数组名[大小]...常指针:指向常量的指针(下一章介绍)。共享数据的保护41例5-7常引用做形参#include<iostream>usingnamespacestd;voiddisplay(constdouble&r);intmain(){doubled(9.5);display(d);return0;}voiddisplay(constdouble&r)//常引用做形参,在函数中不能更新r所引用的对象。{cout<<r<<endl;}共享数据的保护42常对象举例classA{public:A(inti,intj){x=i;y=j;}...private:intx,y;};Aconsta(3,4);//a是常对象,不能被更新共享数据的保护43用const修饰的对象成员常成员函数使用const关键字说明的函数。常成员函数不更新对象的数据成员。常成员函数说明格式:
类型说明符函数名(参数表)const;
这里,const是函数类型的一个组成部分,因此在实现部分也要带const关键字。const关键字可以被用于参与对重载函数的区分通过常对象只能调用它的常成员函数。常数据成员使用const说明的数据成员。共享数据的保护44例5-8常成员函数举例#include<iostream>usingnamespacestd;classR{public:R(intr1,intr2){R1=r1;R2=r2;}voidprint();voidprint()const;private:intR1,R2;};共享数据的保护45voidR::print(){cout<<R1<<":"<<R2<<endl;}voidR::print()const{cout<<R1<<";"<<R2<<endl;}voidmain(){Ra(5,4);a.print();//调用voidprint()
constRb(20,52);
b.print();//调用voidprint()const}4646例5-9常数据成员举例#include<iostream>usingnamespacestd;classA{public: A(inti); voidprint(); constint&r;private: constinta; staticconstintb;//静态常数据成员};共享数据的保护47constintA::b=10;A::A(inti):a(i),r(a){}voidA::print(){cout<<a<<":"<<b<<":"<<r<<endl;}voidmain(){/*建立对象a和b,并以100和0作为初值,分别调用构造函数,通过构造函数的初始化列表给对象的常数据成员赋初值*/Aa1(100),a2(0);a1.print();a2.print();}4848编译预处理命令#include包含指令将一个源文件嵌入到当前源文件中该点处。#include<文件名>按标准方式搜索,文件位于C++系统目录的include子目录下#include"文件名"首先在当前目录中搜索,若没有,再按标准方式搜索。#define宏定义指令定义符号常量,很多情况下已被const定义语句取代。定义带参数宏,已被内联函数取代。#undef删除由#define定义的宏,使之不再起作用。49条件编译指令
#if和#endif#if常量表达式
//当“常量表达式”非零时编译程序正文#endif......编译预处理命令50条件编译指令——#else #if常量表达式
//当“常量表达式”非零时编译
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《绚丽的模板》课件
- 《电路分析讲义》课件
- 《灿烂的中华文化》课件
- 膝关节松动专题知识讲座培训课件
- 辩论稿作文讲解课件
- 《珍惜劳动成果》课件
- 2026年零售药店营业员岗位培训考核试题(附答案)
- 不良反应的课件
- 玻璃分析小说课件
- 浙江省2026年中级导游等级考试(导游知识专题)冲刺模拟试题及答案
- 2025年安徽中考英语试卷(真题+答案)
- 石灰石矿山采剥作业规范
- 2021-2026年高考英语真题分项解读及变式汇编20 阅读理解B篇真题变式题(解析版)
- 百家争鸣说课课件2026-2027学年统编版七年级历史上册
- 2026年安徽省普通高校分类考试招生和对口招生文化素质测试语文试题
- 2026年及未来5年市场数据中国职业非学历教育行业市场发展数据监测及投资潜力预测报告
- 期刊审读阅评工作制度
- 多台阶覆盖式排土场设计施工方案(含概算)
- 自考学习资料 考前必背英语二10篇范文
- 通信施工安全员c证再教育题库及答案解析
- 八师兵团职工考试题库及答案
评论
0/150
提交评论