ITEEDU

6.16 通过默认的成员复制进行赋值

赋值运算符(=)可以将一个对象赋给另一个相同类型的对象。这种赋值默认通过成员复制(memberwisecopy)进行,对象的每个成虽一一复制给另一对象的同一成员(如图6.L1)(注意:如果类的数据成员包含动态分配存储体,则通过默认的成员复制赋值可能导致严重问题,第8章“运算符重载”中将介绍这些问题及其处理方法)。

对象可以作为函数参数传递并从函数返回。这种传递和返回默认按值调用进行,即传递和返回对象的副本(第8章“运算符重载”中将介绍几个例子)。

性能提示6.4

按值调用传递对象的安全性较好,因为被调函数无法访问原始对象.但如果要复制大对象,则按值调用可能使性能下降。对象按引用调用传递时可以按指针或对象引用传递。按引用调用有性能优势,但安全性较差,因为被调函数可以访问原始对象。按常量引用调用则既安全,又有性能优势。

  // 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 通过默认的成员复制将对象赋给另一相同类型的对象

6.17 软件复用性

编写面向对象程序的目的是要实现有用的类。类可以通过大量机会获取和分类,让广大程序员使用。许多类库(class library)已经存在,许多类库还在不断开发。人们正在不断推广应用这些类库。软件越来越趋向于从现有的,定义良好、经过认真测试、文档齐全、可移植的各种组件进行构造。这种软件复用性加速了强大的高质量软件的开发速度。通过复用组件实现快速应用程序开发(rapid applications development,RAD)已经成为一个重要领域。

但还要先解决一些重要问题才能完全实现软件复用性。我们需要有分类机制、许可证机制,用保护机制来保证类的主副本不被搞乱,用描述机制让新系统设计人员能够确定现有对象是否满足其需求,用浏览机制确定有什么类及其与软件开发人员要求的接近程度等等。许多有趣的研究和开发问题需要解决。人们正在积极解决这些问题.因为这种方案的潜在价值是巨大的。

6.18 有关对象的思考:编写电梯模拟程序

在第1章到第5章“有关对象的思考”中,我们介绍了面向对象的基础,介绍了电梯模拟程序的面向对象设计,第6章介绍了编程和使用C++类的细节。现在就可以开始编写电梯模拟程序的类。

电梯实验室任务4

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.有的学生还可以用动画图形输出,在屏幕上显示电梯上下移动。