和3中,net被赋给该临时对象。
第,使用完临时对象后,将把它丢弃。例如,对于语句2,程序计算forcel和force2之和,将结果
复制到临时返回对象中,再用net的内容覆盖临时对象的内容,然后将该临时对象丢弃。原来的矢量全都
保持不变。语句3显示临时对象的长度,然后将其删除。
如果您担心这种行为可能引发的误用和滥用,有一种简单的解决方案:将返回类型声明为const Vector。
例如,如果 Vector :: operator+()的返回类型被声明为const Vector,则语句1仍然合法,但语句2和3将是
非法的。
总之,如果方法或函数要返回局部对象,则应返回对象,而不是指向对象的引用。在这种情况下,将
使用复制构造函数来生成返回的对象。如果方法或函数要返回一个没有公有复制构造函数的类(如ostream
类)的对象,它必须返回·个指向这种对象的引用。最后,有些方法和函数(如重载的赋值操作符)可以
返回对象,也可以返回指向对象的引用,在这种情况下,应首选引用,因为其效率更高。12.1.6 使
用指向对象的指针C++程序经常使用指向对象的指针,因此,这里来练习一下。程序清单12.6使用数组索引值来跟踪最
短的字符串和按字母顺序排在最前面的字符串。另一种方法是使用指针指向这些类别的开始位置,程序清
单12.7 使用两个指向 String的指针实现了这种方法。最初,shortest指针指向数组中的第一个对象。每当
程序找到比指向的字符串更短的对象时,就把shortest重新设置为指向该对象。同样,first指针跟踪按字母
顺序排在最前面的字符串。这两个指针并不创建新的对象,而只是指向已有的对象。因此,这些指针并不
要求使用new来分配内存。
除此之外,程序清单12.7中的程序还使用一个指针米跟踪新对象:
String * favorite = new String (sayings[choice]) :
这里指针favorite指向new创建的未被命名对象。这种特殊的句法意味着使用对象saying[choice]来初
始化新的String对象,这将调用复制构造函数,因为复制构造函数(const String&)的参数类型与初始化
值(saying[choice])匹配。程序使用 srand()、rand()和time()随机选择一一个值。
程序清单 12.7 sayings2.cpp
// sayings2.cpp -- uses pointers to objects
// compile with stringl.cpp
#include
#include
Finclude
#include "stringl.h"
const int Arsize = 10:
const int MaxLen = 81:
int main()
using namespace std;
String name:
cout << "Hi. what's your name?\n>> ":
cin >> name:
cout << name << ", please enter up to " << ArSize
<< " short sayings
String sayings[ArSize]:
char temp(MaxLen]:
int i:
for (i - 0: i < ArSize: i++)
cout << 1+1 << ": ":
cin.get (temp. MaxLen):
while (cin s& cin.get() != '\n')
continue:
// (or stdlib.h) for rand(), srand()
// (or time,h) for time()
// temporary string storage