4. 返回 const 对象

// 1: three Vector objects

// 2: dyslectic programming

String s2, $3;
s3 = s2 = sl;
在上述代码中,s2.operator=(s2)的返回值被赋给s3。为此,返回String对象或String对象的引用都是
可行的,但与Vector范例中一样,通过使用引用,可避免该函数调用String的复制构造函数来创建一个新
的String对象。在这个例子中,返回类型不是const,因为方法operator=()返回一个指向s2的引用,可以
对其进行修改。
Operator << ()的返回值用于串接输出:
String s1("Good stuff");
cout << s1 << "is coming!";
在上述代码中,operator << (cout,s1)的返回值成为一个用于显示字符串“is coming!”的对象。返回类型
必须是ostream&,而不能仅仅是ostream。如果使用返回类型ostream,将要求调用 ostream类的复制构造
函数,而ostream没有公有的复制构造函数。幸运的是,返回一个指向cout的引用不会带来任何问题,因
为cout已经在调用函数的作用域内。

3. 返回对象
如果被返回的对象是被调用函数中的局部变量,则不应按引用方式返回它,因为在被调用函数执行完
毕时,局部对象将调用其析构函数。因此,当控制权回到调用函数时,引用指向的对象将不再存在。在这
种情况下,应返回对象而不是引用。通常,被重载的算术操作符属于这一类。请看下述范例,它再次使用
了 Vector类:
Vector forcel (50,60);
Vector force2 (10, 70) ;
Vector net;
net = forcel + force2;
被返回的不是force1,也不是force2,forcel和force2在这个过程中应该保持不变。因此,返回值不能
是指向在调用函数中已经存在的对象的引用。相反,在Vector :: operator+()中计算得到的两个矢量的和被存
储在-个新的临时对象中,该函数也不应返回一个指向该临时对象的引用,而应该返回实际的Vector对象,
而不是引用:
Vector Vector :: operator+(const Vector & b) const

return Vector (x + b.x, y + b.y);

在这种情况下,存在调用复制构造函数来创建被返回的对象的开销,然而这是无法避免的。
在上述范例中,构造函数调用 Vector(x+b.x,y+b.y)创建一个方法 operator+()能够访问的对象;而返
回语句引发的对复制构造函数的隐式调用创建一个调用程序能够访问的对象。

4. 返回 const 对象
前面的 Vector :: operator+()定义有一个奇异的属性,它旨在让您以下面这样的方式使用它:
net = forcel + force2;
然而,这种定义也允许您这样使用它:
forcel + force2 = net;
cout << (forcel + force2 = net).magval() << endl; // 3: demented programming
这提出了三个问题。为何编写这样的语句?这些语句为何可行?这些语句有何功能?
首先,没有要编写这种语句的合理理由,但并非所有代码都是合理的。即使是程序员也会犯错。例如,
为 Vector类定义operator == ()时,您可能错误地输入这样的代码:
if (forcel + force2 = net)
而不是:
if (forcel + force2 == net)
另外,程序员通常很有创意,这可能导致错误。
其次,这种代码之所以可行,是因为复制构造函数将创建一个临时对象来表示返回值。因此,在前面
的代码中,表达式force1+force2的结果为一个临时对象。在语句1中,该临时对象被赋给net;在语句2

你可能感兴趣的:(算法,开发语言,c++)