关于 类成员函数返回指向const临时变量的引用

来源:互联网 发布:交响乐 知乎 编辑:程序博客网 时间:2024/05/21 18:43

成员函数使用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) 

0 0
原创粉丝点击