chapter06 深入类和对象.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * * * * * * * * * * * * * * * * * * * * * * * * * 6.6 与类和对象相关的问题 6.6.4 常成员函数 类的某些成员函数只是读取属性而不修改它们。这样,可以将这样的成员说明成是常成员。例如: class Rectangle //简化版 { private: int width, height; //other members public: double area() const { return width * height; } }; 关键字const将成员函数area()的this指针和它指向的对象约束成为常量,因此在其内部任何试图改变对象状态的操作都是非法的。在常成员函数中不能调用非常成员函数,因为那些函数有可能改变对象的状态。 如果在类内声明常成员函数而在类外定义它,那么二者的声明必须完全一致。例如: class Rectangle //简化版 { private: int width, height; //other members public: double area() const; }; ? double Rectangle::area() const { return width * height; } 6.6 与类和对象相关的问题 6.6.5 嵌套类 我们在设计类时会遇到这样的问题:类B需要另一个类A提供服务。如果类A只为类B提供服务,那么A最好成为B的内部类。这里,类A称为类B的“嵌套类(nested class)”,而类B是类A的“包围类”。 1. 嵌套类的定义 class Rectangle { public: string name; ? struct Size { int width, height; void show(); } cxy; }; 6.6 与类和对象相关的问题 2. 在包围类外使用嵌套类需要名字限定 嵌套类的名字完全局部于它的包围类,而它的作用域也被局限在包围类的作用域中。这样一来,嵌套类对包围类以外来说是不可见的,因此在包围类外直接使用嵌套类的名字是不合法的。下面的代码是错误的: void f() { Size size = { 10, 20 }; //错误,在Rectangle外Size是不可见的 } 如果一定要在包围类外使用嵌套类的名字,或者定义嵌套类的成员,那么必须使用名字限定。例如: void f() { Rectangle::Size size = { 10, 20 }; //OK } 请注意这样一个事实:Size定义在Rectangle的public段中。这使得上述使用方法是正确的。如果Size定义在非公有段中,那么它的名字也被私有化了,因此在在包围类外就无法访问嵌套了。 6.6 与类和对象相关的问题 3. 包围类的成员对嵌套类是不可见的 嵌套类形成了一个局部作用域,包围类的成员在这个作用域中是不可见的。下面的show()定义是错误的: void Rectangle::Size::show() //OK, 正确的名字限定 { cout name : width , height endl; //错误,name等包围类的成员对Size来说是不可见的 } 6.6 与类和对象相关的问题 4. 嵌套类的声明和定义可以分开 如果嵌套类的代码比较长,那么可以采用这样的方式来进行:在包围类中声明嵌套类,然后在包围类之外定义嵌套类。例如: class Rectangle { public: string name; ? struct Size; //类的超前声明 }; ? struct Rectangle::Size { … }; //注意使用名字限定 6.6 与类和对象相关的问题 5. 嵌套类中的友元 可以在嵌套类中声明它的友元。例如: class Rectangle { public: struct Size { friend void show(); } cxy; }; 不过,全局函数show()只是类Size的友元,而非包围类Rectangle的。因此,show()函数没有获得特殊的权限访问包围类Rectangle的成员。 6.6 与类和对象相关的问题 6.6.6 类中定义类型 1. 在类中定义枚举类型 class Quadrangle { public: enum ID { RECTANGLE, SQUARE, DIAMOND }; … }; 这样,类型ID被限制在包围类Quadrangle的作用域中。 6.6 与类和对象相关的问题 类中的枚举成员不属于对象,而是该类的所有对象共享的。因此,对枚举成员的访问必须采用名字限定的方式进行

文档评论(0)

chqs52 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档