C语言程序设计4_第1页
C语言程序设计4_第2页
C语言程序设计4_第3页
C语言程序设计4_第4页
C语言程序设计4_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

会计学1C语言程序设计4标识符的作用域与可见性(1/4)什么是标识符?某内存空间的代号什么是标识符的作用域?标识符的有效范围什么是标识符的可见性?如果在当前位置能使用指定的标识符,则该标识符可见第2页/共46页第1页/共46页标识符的作用域与可见性(2/4)标识符有哪些作用域?函数原形作用域函数声明中的形参的作用域块作用域从声明标识符的语句起到包含该声明的}之间通常称具有块作用域的变量为局部变量第3页/共46页第2页/共46页标识符的作用域与可见性(3/4)类作用域类的成员在类内的作用域类内是类声明的{}和所有类的函数的定义部分文件作用域在文件中声明,但没被任何一对{}包括的标识符的作用域通常称之为全局变量第4页/共46页第3页/共46页标识符的作用域与可见性(4/4)标识符的可见性有哪些规则?标识符要先声明,后使用同一作用域内,标识符不能重名不同作用域内,标识符可以重名特例:如果A作用域包含B作用域,B内的标识符会掩蔽掉A中的同名标识符,使其不可见第5页/共46页第4页/共46页思考阅读下述代码,说明其中标识符的作用域Eye::Eye(boolleftIsSmall,boolleftIsSingle):left(leftIsSmall,leftIsSingle){

Eyeleft(leftIsSmall,leftIsSingle);}第6页/共46页第5页/共46页看例子思考本例中变量的作用域?可见性?哪些量是全局变量?如何访问被掩蔽的全局变量?如果将Point::Point(inta,intb)改为Point::Point(intx,inty)会怎样?此时如何访问被掩蔽的类的属性?全局变量在其他文件中能使用吗?第7页/共46页第6页/共46页注意一定要注意变量间的掩蔽效应破除掩蔽效应的方法是“称呼变量的全名”如:类名::变量名对于全局变量为:::变量名注意关键字extern的使用第8页/共46页第7页/共46页对象的生存期(1/3)变量和对象有关系吗?什么关系?变量就是对象!默认情况下:变量和对象指内存中的一段连续空间变量名和对象名则是该段内存空间的起始地址的代号第9页/共46页第8页/共46页对象的生存期(2/3)对象的动态生存期:对象在被声明时创建,在它的对象名的作用域结束时销毁具有动态生存期的对象都储存在“栈”中第10页/共46页第9页/共46页对象的生存期(3/3)对象的静态生存期:对象的生存期与程序的运行期相同全局变量具有静态生存期局部变量如果希望具有静态生存期,则必须在声明时用static关键字说明通常这些对象被放在“堆”中第11页/共46页第10页/共46页看例子思考本例中k的生存期?本例中k的可见性?第12页/共46页第11页/共46页思考局部变量具有静态生存期有什么好处?第13页/共46页第12页/共46页注意如果你没有对具有静态生存期的变量做初始化,则编译器会将它初始化为0使用具有静态生存期的变量应谨慎因为虽然这样做会使变量的使用更加方便,但却会破坏安全性第14页/共46页第13页/共46页类的静态成员(1/6)类的封装机制使对象的数据成员在类内能共享访问,但在类外严格限制对对象的数据成员的访问什么是类内?什么是类外?第15页/共46页第14页/共46页类的静态成员(2/6)类的数据成员是什么意思?类的函数成员是什么意思?类的属性是什么意思?通常情况下:类的属性指类的所有对象共同具有的属性第16页/共46页第15页/共46页思考饭卡类中:所有饭卡共用一个账户,还是每个饭卡均有自己的账户?在类中:每个对象共用一个属性,还是每个对象都有自己的属性?同一类的对象间,可不可以拥有共同的属性?可不可以有属于类,但不属于任何对象的属性?第17页/共46页第16页/共46页类的静态成员(3/6)类内可以有静态成员静态数据成员静态函数成员什么样的成员应写成静态数据成员?如果类有某属性,该属性独立于该类的任何一个对象(即:要么被所有对象共用,要么与任何对象无关),则该属性应被声明为静态数据成员第18页/共46页第17页/共46页类的静态成员(4/6)静态数据成员的应用场合:用来保存流动变化的对象个数用做一个标志如果类的对象的数据结构是链表,则通常指向第一个成员或最后一个成员的指针用静态数据成员表示静态数据成员不依附于任何一个对象而存在第19页/共46页第18页/共46页类的静态成员(5/6)静态数据成员的声明:用static关键字指明静态数据成员的初始化:在该类的所有成员函数的实现前实现静态数据成员的使用:与动态数据成员的使用方式一样第20页/共46页第19页/共46页变形金刚类例:Transformer引入:静态数据成员:number第21页/共46页第20页/共46页思考本例中用什么方式声明的类内静态数据成员?怎么初始化的该成员?怎么使用的该成员?如果让计数器number正确工作需要修改哪些函数?第22页/共46页第21页/共46页类的静态成员(6/6)静态函数成员的应用场合:独立于任何对象的函数专门用来访问静态数据成员的函数静态函数成员不依附于任何一个对象而存在因此:静态函数成员可以直接访问的只有该类的静态成员如果要访问非静态成员,必须要用对象做媒介第23页/共46页第22页/共46页变形金刚类例:Transformer引入:静态函数成员:voidFortify()静态函数成员:voidResetNumber()静态函数成员:voidCharge(……)第24页/共46页第23页/共46页思考本例中用几种方式使用类内的静态函数成员?Transformer::Fortify();在逻辑上应该如何解释?prime.Fortify();又应该怎么解释?第25页/共46页第24页/共46页思考阅读下述代码,找出错误并解释原因classA{ private: inti=1;};第26页/共46页第25页/共46页思考阅读下述代码,找出错误并解释原因classA{ private: staticinti=1;};第27页/共46页第26页/共46页思考阅读下述代码,找出错误并解释原因classA{ private: staticinti;};A::i=1;第28页/共46页第27页/共46页思考阅读下述代码,找出错误并解释原因classA{ private: inti; public: staticvoidTest();};voidA::Test(){i=100;}第29页/共46页第28页/共46页总结类中所有动态数据成员,只能通过构造的方式创建,它们依附于对象类中的所有静态数据成员,在类存在的那一刻起就被创建了,它们独立于对象类中所有动态数据成员,只能通过非静态函数成员访问和修改类中所有静态数据成员,在类内可以被任意修改第30页/共46页第29页/共46页类的友元(1/2)什么是友元?友元就是类的好友因此:类内所有信息对友元是可见的为什么被封装的类还要使用友元?为了提高访问对象的效率,节省访问对象的时间第31页/共46页第30页/共46页类的友元(2/2)有哪些友元?友元函数友元类怎么指明友元?用friend关键字指明必须要在类内声明友元classWallet{ double balance;public: voidIncrease(doublemoney); voidDecrease(doublemoney); voidSetBalance(doublemoney); doubleGetBalance(); friendvoidFriendGate(WallettheFriend, doublemoney); friendclassGirlFriend;};第32页/共46页第31页/共46页注意友元函数可以是普通函数友元函数也可以是其他类的成员函数友元可以直接访问和修改类或对象的成员如果A类为B类的友元类,则A类的所有成员函数都是B类的友元函数见书136~139页第33页/共46页第32页/共46页注意友元关系不能传递友元关系是单向的友元关系不能被继承第34页/共46页第33页/共46页常量(1/6)字面值常量与“不能变的变量”怎么能指明某个变量为常量?用const关键字指明例:constdoublei=100.0;conststringname="zhangsan";也可以:doubleconsti(100.0);第35页/共46页第34页/共46页常量(2/6)constdoublepi=3.1416与#definePI3.1416的区别?pi在程序运行期间有自己专门的空间,空间内存储3.1416程序中的PI会在编译后被替换成3.1416第36页/共46页第35页/共46页常量(3/6)常引用语法:const类型&变量名例:constdouble&r=a;作用:r在其作用域内不能被修改常引用多用于函数的参数传递,即:既希望用引用来提高效率,又不希望修改原有的值时。constdouble&r=a;作用:r在其作用域内不能被修改但a能不能被修改?第37页/共46页第36页/共46页思考阅读下述代码,找出错误并解释原因inttest(int&val){returnval++;}voidmain(){ shortv1=0; constintv2=100; intv3=test(v1); v3=test(v2); v3=test(100); v3=test(v1+v2);}第38页/共46页第37页/共46页注意引用要求“一模一样”!但常引用限制没有这么多!好的编程习惯:设计形参时,将所有不希望在函数体内改变其值的参数设计为——常引用第39页/共46页第38页/共46页常量(4/6)常对象语法:类型const变量名例:Pointconstorigin(0,0);作用:origin在它的生存期内不能被改变常对象必须进行初始化,而且不能被更新第40页/共46页第39页/共46页思考如何修改对象的属性值?对常对象而言,这些修改方式有作用吗?第41页/共46页第40页/共46页注意为了防止通过行为修改常对象的值,C++规定常对象不能调用任何普通成员函数!可是,不能调用行为的对象有什么用?第42页/共46页第41页/共46页常量(5/6)常成员函数语法:类型函数名(形参表)const例:voidShow(inttest)const;作用:该函数专供常对象使用第43页/共46页第42页/共46页注意const在函数定义和声明中都不能省略!常成员函数不能更新对象的数据成员,也不能调用该类中没有用const修饰的成员函数!常对象只能调用常成员函数,不能调用其它成员函数const

温馨提示

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

最新文档

评论

0/150

提交评论