- 1、本文档共194页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第17章C++类第2部分
第17章 C++类:第二部分
目标
可以动态创建和破坏对象。
可以指定const(常量)对象和const成员函数。
理解friend函数和友类的目的。
理解如何使用static数据成员和成员函数。
理解容器类的概念。
理解可以遍历容器类的元素的迭代器类的概念。
理解this指针的使用。
17.1 简 介
在本章中,我们继续研究类和数据抽象。我们在第18章中将讨论更多的高级内容,并建立类和运算符重载讨论的基础。第16章~第18章的讨论鼓励程序员使用对象,我们称之为基于对象的编程方法(OBP,object-based programming)。然后,第19章和第20章介绍了继承和多态性,这是真正面向对象的编程技术(OOP,object-oriented programming)。在本章和后面的章节中,我们使用在第8章中介绍的C样式的字符串,这将帮助您掌握C指针的复杂内容,准备进入专业世界,在这里,您将看见过去20年中所遗留的大量C代码。
17.2 const(常量)对象和const成员函数
我们已经强调了,最低特权原则是好的软件工程所用的最基本原则之一。下面研究这个原则如何应用于对象。
一些对象需要修改,而另外一些不需要。程序员可以使用关键字const来指定对象不能修改,而尝试修改该对象将导致语法错误。例如:
const Time noon( 12, 0, 0 );
声明了类Time的const对象noon,并将其初始化为12。
软件工程经验17.1 将对象声明为const有助于实施最低特权原则。这样,在编译时可以捕获修改对象的尝试,而不是导致执行期间错误。
软件工程经验17.2 使用const对于正确的类设计、程序设计和编码是非常重要的。
性能提示17.1 声明变量和对象是const并不仅仅是有效的软件工程方法,因为现在的高级优化编译程序可以对常量执行某些优化,而不能对变量进行优化,因此它也可以改善性能。
C++编译程序不允许任何成员函数调用const对象,除非成员函数本身也声明为const。这甚至对于不修改对象的get成员函数也是一样的。声明为const的成员函数不会修改对象,编译程序不允许这样。
在函数原型中,通过在函数的参数列表后面插入关键字const,或者在函数定义中,在函数体开始的左大括号之前加入关键字const,就可以在原型和定义中指定函数是const。例如,下面的类A的成员函数:
int A::getValue( ) const { return privateDataMember; }
仅仅返回对象的一个数据成员的值,而且正确声明为const。
常见的编程错误17.1 将修改对象数据成员的成员函数定义为const将导致语法错误。 常见的编程错误17.2 在类的相同实例上,如果将调用类的非const成员函数的成员函数定义为const,将导致语法错误。
常见的编程错误17.3 在const对象上调用非const成员函数将导致语法错误。
软件工程经验17.3 const成员函数可以用非const版本来重载。选择使用哪一个重载成员函数是由编译程序根据对象是否是const来决定的。
这里提出了有关构造函数和析构函数的有趣问题,它们每一个都需要经常修改对象。并且不允许对const对象的构造函数和析构函数使用const声明。必须允许构造函数修改对象,这样可以正确地初始化对象。析构函数必须可以在破坏对象之前终止清理杂务。
常见的编程错误17.4 尝试声明构造函数或者析构函数为const将导致语法错误。 图17.1实例化了两个Time对象:一个是非const对象,另一个是const对象。该程序尝试用非const成员函数setHour(第102行)和printStandard(在第108行)来修改const对象noon。程序也说明了在对象上调用成员函数的3个其他组合:在非const对象上调用非const成员函数(第100行),在非const对象上调用const成员函数(第104行),以及在const对象上调用const成员函数(第106行和107行)。两个流行的编译程序为非const成员函数在const对象上调用而产生的消息显示在输出窗口中。
1 // Fig. 17.1: time5.h
2 // Declaration of the class Time.
3 // Member functions defined in time5.cpp
4 #ifndef TIME5_H
5 #define TIME5_H
6
7 class Time {
8 public:
9 Time( int = 0, int = 0
文档评论(0)