OOP(C++)_第6章_类成员(最终版)【高教材料】

上传人:pu****.1 文档编号:567590850 上传时间:2024-07-21 格式:PPT 页数:31 大小:319KB
返回 下载 相关 举报
OOP(C++)_第6章_类成员(最终版)【高教材料】_第1页
第1页 / 共31页
OOP(C++)_第6章_类成员(最终版)【高教材料】_第2页
第2页 / 共31页
OOP(C++)_第6章_类成员(最终版)【高教材料】_第3页
第3页 / 共31页
OOP(C++)_第6章_类成员(最终版)【高教材料】_第4页
第4页 / 共31页
OOP(C++)_第6章_类成员(最终版)【高教材料】_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《OOP(C++)_第6章_类成员(最终版)【高教材料】》由会员分享,可在线阅读,更多相关《OOP(C++)_第6章_类成员(最终版)【高教材料】(31页珍藏版)》请在金锄头文库上搜索。

1、面向对象程序设计 中国科学技术大学计算机系 马建辉1第六章第六章 类成员类成员(二二)面向对象程序设计面向对象程序设计(C+)面向对象程序设计 中国科学技术大学计算机系 马建辉26 类成员(二)类成员(二)6.1 成员变量与成员函数成员变量与成员函数6.2 this指针指针6.3 成员对象成员对象6.4 const(常量常量)6.5 const对象与对象与const成员函数成员函数6.6 静态成员变量与静态成员函数静态成员变量与静态成员函数面向对象程序设计 中国科学技术大学计算机系 马建辉36.4 const量量(常量常量)从高质量程序设计的角度考察从高质量程序设计的角度考察C+C+中的中的c

2、onstconst!面向对象程序设计 中国科学技术大学计算机系 马建辉46.4.1 const的意义的意义F最低权限原则最低权限原则: 软件工程的基本原则之一软件工程的基本原则之一。 const的意义的意义: 在可更改与不可更改之间画一条明在可更改与不可更改之间画一条明确的界线,提高程序的安全性和可控性。确的界线,提高程序的安全性和可控性。 eg: const int i=100; i+; /编译编译错误错误 面向对象程序设计 中国科学技术大学计算机系 马建辉56.4.2 C中的中的const(常量常量)F“一个不能被改变的普通变量一个不能被改变的普通变量”。F因此:因此: - - 总是占用存

3、储;总是占用存储; - - 名字是全局的。也就是说,默认情况下,名字是全局的。也就是说,默认情况下,constconst是外是外部连接的部连接的( (容易引起容易引起“名字冲突名字冲突”) )。 const int bufsize; / 无需初始化无需初始化 const int bufsize = 100 ; char bufbufsize ; / error! Why? 在编译时,编译器并不知道在编译时,编译器并不知道constconst的值,它只是一个的值,它只是一个“运行时常量运行时常量”。面向对象程序设计 中国科学技术大学计算机系 马建辉66.4.3 C+的的ConstF通常,通常,C

4、+C+编译器不为编译器不为constconst创建存储空间,而是把它保存创建存储空间,而是把它保存在在“符号表符号表”里,即里,即“编译时常量编译时常量”。 const int bufsize; / 非法,未赋初值非法,未赋初值 const int bufsize = 100; char strbufbufsize; / OK, Why?F默认情况下,默认情况下,C+C+中的中的constconst是内部连接的,也就是说,是内部连接的,也就是说,constconst仅在仅在constconst被定义过的文件里才是可见的。(因此,被定义过的文件里才是可见的。(因此,不用担心名字冲突)不用担心名字

5、冲突)F当定义一个当定义一个constconst时,必须赋一个值给它,除非用时,必须赋一个值给它,除非用externextern做做出了清楚的说明。当用出了清楚的说明。当用externextern说明了说明了constconst时,编译器会强时,编译器会强制为制为constconst分配空间,而不是保存在符号表中。分配空间,而不是保存在符号表中。 extern const int bufsize; / 未赋初值,但未赋初值,但externextern声明声明 了了bufsizebufsize在另一个文件在另一个文件 中定义及赋初值。中定义及赋初值。面向对象程序设计 中国科学技术大学计算机系 马

6、建辉76.4.3 C+的的Const(续续)Fconstconst用于集合,必须为其分配内存,用于集合,必须为其分配内存,( (因为编译器因为编译器“不不愿意愿意”把集合保存到符号表中,太复杂把集合保存到符号表中,太复杂) )。 const int i = 1, 2, 3, 4 ; float fi3; / / 非法,编译期间无法知道存储空间的值。非法,编译期间无法知道存储空间的值。 struct S int i, j; ; const S s = 1, 2 , 3, 4 ; double ds1.j; / / 非法,理由同上非法,理由同上 int main() /: 面向对象程序设计 中国科

7、学技术大学计算机系 马建辉86.4.4 C+中中const的作用的作用G值替代值替代: C+C+的的constconst vs C C中的宏替换中的宏替换 #define BUFSIZE 100; / 宏替换宏替换 char strBUFSIZE; vs const int bufsize = 100; / C+的的const char strbufsize; L在宏替换中,在宏替换中,BUFSIZEBUFSIZE没有类型信息,不能进行类型检查;没有类型信息,不能进行类型检查;L宏定义是全局的,容易名字冲突。宏定义是全局的,容易名字冲突。面向对象程序设计 中国科学技术大学计算机系 马建辉96.

8、4.4 C+中中const的作用的作用(续续)A 安全性安全性 如果如果想用想用运行期间产生的值初始化运行期间产生的值初始化一个变量,并且一个变量,并且知道在该变量的生命期内其值不变,则可用知道在该变量的生命期内其值不变,则可用constconst限定该限定该变量,达到最大限度地保证改变量安全性的目的。变量,达到最大限度地保证改变量安全性的目的。int main() cout type a character & CR:; const char c = cin.get(); /用运行期间产生的值初用运行期间产生的值初始化,之后不变始化,之后不变 const char c2 = c + a; c

9、out c2; /: 面向对象程序设计 中国科学技术大学计算机系 马建辉106.4.5 const的应用:的应用:const指针指针1. 指向指向const的指针的指针(指针指向的内存地址的值不能改变指针指向的内存地址的值不能改变) const int *u; / u/ u是一个指针,它指向是一个指针,它指向const int;const int; int const *v; / v/ v是一个指向恰好是是一个指向恰好是constconst的的intint的的 普通指针;普通指针; 2. const指针指针(指针的值不能改变指针的值不能改变) const int d = 1; int * co

10、nst w = &d; / w/ w是一个指针,这个指针是是一个指针,这个指针是 指向指向intint的的constconst指针指针 注意:注意:C+C+中,中,constconst指针必须赋初值指针必须赋初值面向对象程序设计 中国科学技术大学计算机系 马建辉116.4.5 const的应用:的应用:const指针指针(续续)3. const指针指向指针指向const对象对象 int d = 1; const int * const x = &d; int const * const x2 = &d; / x,x2,*x,*x2/ x,x2,*x,*x2都不能改变都不能改变面向对象程序设计

11、中国科学技术大学计算机系 马建辉12F非非constconst对象的地址可以赋给对象的地址可以赋给constconst指针;指针;Fconstconst对象的地址绝不可以赋给非对象的地址绝不可以赋给非constconst指针。指针。 ( (因为这样做可能导致通过非因为这样做可能导致通过非constconst指针改变指针改变constconst对象的对象的值的后果值的后果) )int d = 1;const int e = 2;int* u = &d; / OK - d not const/! int* v = &e; / illegal - e constint* w = (int*)&e;

12、/ legal but bad practiceint main() /: 注意注意面向对象程序设计 中国科学技术大学计算机系 马建辉136.4.6 const的应用:的应用:const参数参数1. 传递传递const值值 void f1(const int i) i+; / 编译时错误,编译时错误,i不能改变不能改变 “形参形参”不能被改变不能被改变 or or “实参实参”不能被改变?不能被改变? 面向对象程序设计 中国科学技术大学计算机系 马建辉146.4.7 const的应用:的应用:const返回值返回值2. 按值返回内部按值返回内部const 常量常量 int f3() retur

13、n 1; const int f4() return 1; / 返回返回const int ; int main() const int j = f3(); / Works fine int k = f4(); / But this works fine too! /:对内部类型来说,按值返回对内部类型来说,按值返回constconst量并没有什么特别的意义量并没有什么特别的意义。 面向对象程序设计 中国科学技术大学计算机系 马建辉156.4.7 const的应用的应用:const返回值返回值(续续)3. 按值返回自定义类型的按值返回自定义类型的const: 实际上阻止了返回值作为左值出现。实

14、际上阻止了返回值作为左值出现。 class X int i; public: X(int ii = 0); void modify(); ; X:X(int ii) i = ii; void X:modify() i+; 面向对象程序设计 中国科学技术大学计算机系 马建辉16X f5() X x(2) return x; / 返回变量返回变量const X f6() return X(); / 按值返回按值返回const;void f7(X& x) / 按值传递非按值传递非const引用引用 x.modify();int main() f5() = X(1); / 正确,正确,f5()返回非返

15、回非const量;量; f5().modify(); / 正确正确 f7(f5(); /可能会有可能会有Warning,跟编译选项有关跟编译选项有关 f6() = X(1); / Error: f6()是常量,不能作左值是常量,不能作左值 f6().modify(); / Error: f6()是常量,不能被修改是常量,不能被修改 f7(f6(); / Error: Why? /:error 2664:cannot convert parameter 1 from const class X to class X &面向对象程序设计 中国科学技术大学计算机系 马建辉176.4.7 const的

16、应用:的应用:const指针指针4. 传递和返回传递和返回const指针指针 char * strcpy(char * dest, const char * src);void t(int*) void u(const int* cip) *cip = 2; / Error: 试图改变值试图改变值 int i = *cip; / OK - copies value int* ip2 = cip; / Error: 试图让非试图让非const * 指向指向 const *const int* const w() static int i; return &i; / 返回静态局部量的地址返回静态局

17、部量的地址面向对象程序设计 中国科学技术大学计算机系 马建辉18int main() int x = 0; int* ip = &x; const int* cip = &x; t(ip); / OK /! t(cip); / Not OK u(ip); / OK u(cip); / Also OK /! int* ip2 = w(); / Not OK const int* const ccip = w(); / OK const int* cip2 = w(); / OK /! *w() = 1; / Not OK /: 当传递一个或返回一个地址时当传递一个或返回一个地址时( (指针或引用

18、指针或引用) ),设置为,设置为constconst可以阻止客户程序员修改其值。可以阻止客户程序员修改其值。面向对象程序设计 中国科学技术大学计算机系 马建辉19F对参数传递而言,对参数传递而言,C+建议用建议用const引用传递替代值传递。引用传递替代值传递。 问:有什么好处?问:有什么好处? 答:兼顾了答:兼顾了效率效率和和易用性易用性 传递地址比传递整个对象更有效;传递地址比传递整个对象更有效;引用传递比指针传递形式上更简单。引用传递比指针传递形式上更简单。面向对象程序设计 中国科学技术大学计算机系 马建辉20作业:作业:8.5 (上机上机)8.16 (上机上机)面向对象程序设计 中国科

19、学技术大学计算机系 马建辉216.5 const对象与对象与const成员函数成员函数本节讨论本节讨论const在类中的应用在类中的应用Fconst数据成员数据成员Fconst成员函数成员函数Fconst对象对象面向对象程序设计 中国科学技术大学计算机系 马建辉226.5.1 const数据成员数据成员class Fred const int size;public: Fred(int sz); void print();Fred:Fred(int sz) : size(sz) void Fred:print() cout size = 0 & qnum = lastquote)29. qnu

20、m = rand() % qsize;30. return quoteslastquote = qnum;31.32.int main() 33. Quoter q;34. const Quoter cq;35. cq.lastQuote(); / OK36./! cq.quote(); / Not OK; non const function37. for(int i = 0; i 20; i+)38. cout q.quote() endl;39. /:面向对象程序设计 中国科学技术大学计算机系 马建辉30小结小结Fconstconst能将对象、函数参数、返回值和成员函数定义能将对象、函数参数、返回值和成员函数定义为常量,还可以进行值替代。为常量,还可以进行值替代。Fconstconst为程序设计提供了又一种非常好的类型检查形为程序设计提供了又一种非常好的类型检查形式及安全性。式及安全性。Fconstconst几乎成了程序正确性的几乎成了程序正确性的“救命稻草救命稻草”。面向对象程序设计 中国科学技术大学计算机系 马建辉31作业:作业:P366(中文版中文版P196): 8.24(上机上机)8.28(提示:参考提示:参考11.1)

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号