赋值运算符(=)可以将一个对象赋给另一个相同类型的对象。这种赋值默认通过成员复制(memberwisecopy)进行,对象的每个成虽一一复制给另一对象的同一成员(如图6.L1)(注意:如果类的数据成员包含动态分配存储体,则通过默认的成员复制赋值可能导致严重问题,第8章“运算符重载”中将介绍这些问题及其处理方法)。
对象可以作为函数参数传递并从函数返回。这种传递和返回默认按值调用进行,即传递和返回对象的副本(第8章“运算符重载”中将介绍几个例子)。
按值调用传递对象的安全性较好,因为被调函数无法访问原始对象.但如果要复制大对象,则按值调用可能使性能下降。对象按引用调用传递时可以按指针或对象引用传递。按引用调用有性能优势,但安全性较差,因为被调函数可以访问原始对象。按常量引用调用则既安全,又有性能优势。
// Fig. 6.12: fig06_12.cpp // Demonstrating that class objects can be assigned // to each other using default memberwise copy #include < iostream.h> // Simple Date class class Date ( public: Date( int = 1, int = 1, int = 1990 ); // default constructor void print(); private: int month; int day; int year; }; // Simple Date constructor with no range checking Date::Date( int m, int d, int y ) { month = m; day = d; year = y; } // Print the Date in the form mm-dd-yyyy void Date::print() { cout << month << '-' << day << '-' << year; } int main() { Date date1( 7, 4, 1993 ), date2; // d2 defaults to 1/1/90 cout << "date1 = "; datel.print(); cout << "\ndate2 = "; date2.print(); date2 = date1; // assignment by default memberwise copy cout << "\n\nAfter default memberwise copy, date2 = "; date2.print(); cout << endl; return 0; }
输出结果:
aatel = 7-4-1993
aate2 = 1-1-1990
After default memberwise copy,date2 = 7-4-1993
图 6.12 通过默认的成员复制将对象赋给另一相同类型的对象
编写面向对象程序的目的是要实现有用的类。类可以通过大量机会获取和分类,让广大程序员使用。许多类库(class library)已经存在,许多类库还在不断开发。人们正在不断推广应用这些类库。软件越来越趋向于从现有的,定义良好、经过认真测试、文档齐全、可移植的各种组件进行构造。这种软件复用性加速了强大的高质量软件的开发速度。通过复用组件实现快速应用程序开发(rapid applications development,RAD)已经成为一个重要领域。
但还要先解决一些重要问题才能完全实现软件复用性。我们需要有分类机制、许可证机制,用保护机制来保证类的主副本不被搞乱,用描述机制让新系统设计人员能够确定现有对象是否满足其需求,用浏览机制确定有什么类及其与软件开发人员要求的接近程度等等。许多有趣的研究和开发问题需要解决。人们正在积极解决这些问题.因为这种方案的潜在价值是巨大的。
在第1章到第5章“有关对象的思考”中,我们介绍了面向对象的基础,介绍了电梯模拟程序的面向对象设计,第6章介绍了编程和使用C++类的细节。现在就可以开始编写电梯模拟程序的类。
1.对第2章到第5章“有关对象的思考”中确定的每个类,编写相应的c++类定义。对每个类,应包括头文件和成员函数定义的源文件。
2.编写一个驱动程序,测试每个类,并运行完整的电梯模拟程序。注意,可能要等学完第7章之后才能完成电梯模拟程序的工作版本,因此要有耐心,先利用第6章的知识实现电梯模拟程序。第7章将介绍复合,即生成以另一个类为成员的类,这个方法可以表示电梯中的按钮、电钤和门对象为电梯的成员。第7章还要介绍如何用New和delete动态生成和删除对象,帮助生成新人的对象和删除离开的人的对象(在人来和人走时)。
3,在电梯模拟程序的第一个版本中,只设计简单的面向文本输出,对发生的每个重要事件显示一个消息。程序中的消息可能包括下列字符串:“Person 1 arrives on Floor 1”、”Person Presses Button on Floor 1、“Elevator arrives on Floor 1”、“Person 1 enters Elevator”等等。注意,建议 将消息中表示对象的单词大写。也可以在学完第7章之后再做这个工作。
4.有的学生还可以用动画图形输出,在屏幕上显示电梯上下移动。