OOP(C++)_第6章_类成员(2)(最终版)_第1页
OOP(C++)_第6章_类成员(2)(最终版)_第2页
OOP(C++)_第6章_类成员(2)(最终版)_第3页
OOP(C++)_第6章_类成员(2)(最终版)_第4页
OOP(C++)_第6章_类成员(2)(最终版)_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

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+中的中的constconst!46.4.1 const的意义的意义F最低权限原则最低权限原则: 软件工程的基本原则之一。软件工程的基本原则之一。 const的意

2、义的意义: 在可更改与不可更改之间画一条明在可更改与不可更改之间画一条明确的界线,提高程序的安全性和可控性。确的界线,提高程序的安全性和可控性。 eg: const int i=100; i+; /编译编译错误错误 56.4.2 C中的中的const(常量常量)F“一个不能被改变的普通变量一个不能被改变的普通变量”。F因此:因此: - - 总是占用存储;总是占用存储; - - 名字是全局的。也就是说,默认情况下,名字是全局的。也就是说,默认情况下,constconst是外是外部连接的部连接的( (容易引起容易引起“名字冲突名字冲突”) )。 const int bufsize; / 无需初始化

3、无需初始化 const int bufsize = 100 ; char bufbufsize ; / error! Why? 在编译时,编译器并不知道在编译时,编译器并不知道constconst的值,它只是一个的值,它只是一个“运行时常量运行时常量”。66.4.3 C+的的ConstF通常,通常,C+C+编译器不为编译器不为constconst创建存储空间,而是把它保存创建存储空间,而是把它保存在在“符号表符号表”里,即里,即“编译时常量编译时常量”。 const int bufsize; / 非法,未赋初值非法,未赋初值 const int bufsize = 100; char strb

4、ufbufsize; / OK, Why?F默认情况下,默认情况下,C+C+中的中的constconst是内部连接的,也就是说,是内部连接的,也就是说,constconst仅在仅在constconst被定义过的文件里才是可见的。(因此,被定义过的文件里才是可见的。(因此,不用担心名字冲突)不用担心名字冲突)F当定义一个当定义一个constconst时,必须赋一个值给它,除非用时,必须赋一个值给它,除非用externextern做出了清楚的说明。当用做出了清楚的说明。当用externextern说明了说明了constconst时,编译器时,编译器会强制为会强制为constconst分配空间,而不

5、是保存在符号表中。分配空间,而不是保存在符号表中。 extern const int bufsize; / 未赋初值,但未赋初值,但externextern声明声明 了了bufsizebufsize在另一个文件在另一个文件 中定义及赋初值。中定义及赋初值。76.4.3 C+的的Const(续续)Fconstconst用于集合,必须为其分配内存,用于集合,必须为其分配内存,( (因为编译器因为编译器“不不愿意愿意”把集合保存到符号表中,太复杂把集合保存到符号表中,太复杂) )。 const int i = 1, 2, 3, 4 ; float fi3; / / 非法,编译期间无法知道存储空间的值

6、。非法,编译期间无法知道存储空间的值。 struct S int i, j; ; const S s = 1, 2 , 3, 4 ; double ds1.j; / / 非法,理由同上非法,理由同上 int main() /: 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在宏替换中,在宏替换中,BUFS

7、IZEBUFSIZE没有类型信息,不能进行类型检查;没有类型信息,不能进行类型检查;L宏定义是全局的,容易名字冲突。宏定义是全局的,容易名字冲突。96.4.4 C+中中const的作用的作用(续续)A 安全性安全性 如果如果想用想用运行期间产生的值初始化运行期间产生的值初始化一个变量,并且一个变量,并且知道在该变量的生命期内其值不变,则可用知道在该变量的生命期内其值不变,则可用constconst限定该限定该变量,达到最大限度地保证改变量安全性的目的。变量,达到最大限度地保证改变量安全性的目的。int main() cout type a character & CR:; const

8、char c = cin.get(); /用运行期间产生的值初用运行期间产生的值初始化,之后不变始化,之后不变 const char c2 = c + a; cout 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

9、. const指针指针(指针的值不能改变指针的值不能改变) const int d = 1; int * const 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

10、,x2,/ x,x2,* *x,x,* *x2x2都不能改变都不能改变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 -

11、 e constint* w = (int*)&e; / 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() return 1; const int f4(

12、) 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: 实际上阻止了返回值作为左值出现。实际上阻止了返回值作为左值出现。 class X int i; public: X(in

13、t 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()返回非返回非const量;量; f5().modify(); / 正确正确 f7(f5(); /可能会有可能会有Warning,跟编译选

14、项有关跟编译选项有关 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的应用:的应用:const指针指针4. 传递和返回传递和返回const指针指针 char * strcpy(char * dest, const char * src);v

15、oid 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; / 返回静态局部量的地址返回静态局部量的地址18int main() int x = 0; int* ip = &x; const int* cip = &x; t(ip); /

16、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 /: 当传递一个或返回一个地址时当传递一个或返回一个地址时( (指针或引用指针或引用) ),设置为,设置为constconst可以阻止客户程序员修改其值。可以阻止客户程序员修改其值。19F对参数传递而言,对参数传递而言,C+建议用建议用const引用传递替代值传递。引用

17、传递替代值传递。 问:有什么好处?问:有什么好处? 答:兼顾了答:兼顾了效率效率和和易用性易用性 传递地址比传递整个对象更有效;传递地址比传递整个对象更有效; 引用传递比指针传递形式上更简单。引用传递比指针传递形式上更简单。20作业:作业:8.5 (上机上机)8.16 (上机上机)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)n qnum = rand() % qsize;n return quoteslastquote = qnum;nnint main() n Quoter q;n const Quoter cq;n cq.lastQuote(); / OKn/! cq.quote(); / Not OK; non const functionn for(int i =

温馨提示

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

评论

0/150

提交评论