成员函数使用const引用常见原因是为了提高程序效率(若返回对象则会调用复制构造函数,而返回引用不会。)
eg:
Vector force1 (50.60);
Vector force2 (10,70);
Vector max;
max=Max(force1,force2);
返回对象实现:
方法1:返回对象将调用复制构造函数以赋值给Max
Vector Max (const Vector &v1,const Vector &v2)
{
if (V1.magval()>v2.magval())
return v1;
else
return v2;
}
方法2:这里要注意引用指向的Max已经在定义过。
const Vector & Max (const Vector &v1,const Vector &v2)
{
if (V1.magval()>v2.magval())
return v1;
else
return v2;
}
那么引出思考,弱返回指向的引用是未声明定义的临时变量会如何。如const Vector & Max_temp()
这里我们做一个实验:
#define _PAUSE cout << "暂停,按任意键..." << endl;\
getche();
class A
{
private:
long _la;
public:
A(){_la = 9;}
~A()
{
cout<< "析构" <<endl;
}
void show(void) const
{
scout << "@: " << _la << endl;
}
};
A func(void)
{
A a; //局部变量;
return a; //以a考贝建构临时对象,假定名为_a_temp!
//a的生命期在这儿终止,你将看到函数结束后,析构a!
}
void main()
{
{
const A &ref=func();
ref.show(); //这个函数演示出引用的临时变量仍具生命力!
_PAUSE;
//ref引用变量的生命期终止,ref引用的临时对象在这儿析构!
}
_PAUSE;
}
最终运行结果如下:
析构 //a的生命期在这儿终止,你将看到函数结束后,析构a!
@:9 //可以传递a的值,说明这个函数演示出引用的临时变量ref仍具生命力!
暂停,按任意键..(任意键)
析构 /ref引用变量的生命期终止,ref引用的临时对象在这儿析构!
暂停,按任意键..
则结论:
上述演示程序可以证明,ref绑定的临时对象并未随其生命期的结束(func的最后一个右括号)而析构,而是在ref的生命期结束后才析构。
C++标准规定:"如果一个临时性对象被绑定于一个引用,对象将残留,直到被初始化之引用的生命期结束"(见《Inside The C++ Object Model》page275)