必须返回对象,而不是引用

来源:互联网 发布:矩阵归一化例题 编辑:程序博客网 时间:2024/05/03 05:38

必须返回对象,而不是引用

         通过引用传递对象,可以看到从效率到简洁性的各种好处,但事实是,返回值并非一定要返回引用,特别是,对于那些必须返回对象的函数而言,返回引用往往导致未定义的错误。

       这里定义一个简单的类,只含有一个数据成员:

      class X

       {

            int i;

                public:

                    X(int ii=0):i(ii){}

                   friend const X& operator*(const X& lhs,const X& rhs); 

      };

      其实现版本为:

           const X& operator*(const X& lhs,const X& rhs)

          {

                 return X(lhs.i * rhs.i);

          }

       这里返回的对象X其实只是一个临时对象,当函数执行结束时,这个临时对象就会被销毁,但返回为引用,从而这个引用是一个未知对象的别名,任何使用这个引用的地方都将可能会导致未定义行为。

      那么是否可以不销毁这个对象,这样不就可以返回引用了么?解决方法也很简单,我们直接声明这个对象为static不就可以啦:

      const X &operator*(const X& lhs,const X& rhs)

      {

                   static X temp;

                   temp=...  //相关操作

                   return temp;

     }

      每一次调用函数,这个static对象将不会被销毁,从而返回其引用也就不会导致未定义行为,那么这个问题得到实质性解决了么?如果使用一下调用的话

          X a(1),b(2),c(3),d(4);

          if(a*b==c*d) {}

      很遗憾,这里我们调用两次operator*,得到两个返回值,再调用==操作符,去比较它们是否相等,但得到的结果将永远为真,而且必须说明的是,每一次调用operator*temp的值都将改变,但由于返回的是static的引用,所以调用端看到的永远是temp的现值,因而得到结果恒真也就不难理解啦!

     正确的解决方案是,本来就该返回对象的值,我们就不要再去返回引用,每一次想返回引用时,就去思考一次返回的这个引用的另一个别名是什么,如果没有,那么最好的方法还是直接返回对象。毕竟,要考虑到返回一个已经被销毁对象的引用,其后果有多么严重!

 

原创粉丝点击