6.16 通过默认的成员复制进行赋值
优质
小牛编辑
134浏览
2023-12-01
赋值运算符(=)可以将一个对象赋给另一个相同类型的对象。这种赋值默认通过成员复制(memberwisecopy)进行,对象的每个成虽一一复制给另一对象的同一成员(如图6.L1)(注意:如果类的数据成员包含动态分配存储体,则通过默认的成员复制赋值可能导致严重问题,第8章“运算符重载”中将介绍这些问题及其处理方法)。
对象可以作为函数参数传递并从函数返回。这种传递和返回默认按值调用进行,即传递和返回对象的副本(第8章 运算符重载 中将介绍几个例子)。
性能提示 6.4
按值调用传递对象的安全性较好,因为被调函数无法访问原始对象.但如果要复制大对象,则按值调用可能使性能下降。对象按引用调用传递时可以按指针或对象引用传递。按引用调用有性能优势,但安全性较差,因为被调函数可以访问原始对象。按常量引用调用则既安全,又有性能优势。
1 // Fig. 6.12: fig06_12.cpp
2 // Demonstrating that class objects can be assigned
3 // to each other using default memberwise copy
4 #include <iostream.h>
5
6 // Simple Date class
7 class Date (
8 public:
9 Date( int = 1, int = 1, int = 1990 ); // default constructor
10 void print();
11 private:
12 int month;
13 int day;
14 int year;
15 };
16
17 // Simple Date constructor with no range checking
18 Date::Date( int m, int d, int y )
19 {
20 month = m;
21 day = d;
22 year = y;
23 }
24
25 // Print the Date in the form mm-dd-yyyy
26 void Date::print()
27 { cout << month << '-' << day << '-' << year; }
20
29 int main()
3O {
31 Date date1( 7, 4, 1993 ), date2; // d2 defaults to 1/1/90
32
33 cout << "date1 = ";
34 datel.print();
35 cout << "\ndate2 = ";
36 date2.print();
37
38 date2 = date1; // assignment by default memberwise copy
39 cout << "\n\nAfter default memberwise copy, date2 = ";
40 date2.print();
41 cout << endl;
42
43 return 0;
44 }
输出结果:
aatel = 7-4-1993
aate2 = 1-1-1990
After default memberwise copy,date2 = 7-4-1993
图 6.12 通过默认的成员复制将对象赋给另一相同类型的对象