关于函数调用返回引用错误并且每次调用不一致的分析与解决

引用与指针的区别

1.引用不能为空,不存在空引用,但是指针却可以存在空指针,这就意味着我们拿到一个引用时不需要判断引用是否为空,但是如果拿到的是一个指针,则需要判断指针是否为空之后再进行指针的进一步操作。

2、引用一旦建立,将一直效忠于他,不能再引用。

引用与变量的区别

1.如果将一个变量绑定到一个引用上,那么如果这个引用发生改变,它所指向的变量也会发生改变。(这点非常重要,特别是在函数调用时,经常将函数的形参设计为引用类型,来达到形参发生改变实参改变的目的);
2.如果一个函数返回的类型为引用,那么返回的引用会绑定到该函数的返回 return value;(变量value就会绑定到返回引用变量,一旦该返回变量value被销毁,那么返回的引用就会绑定到被销毁的变量,这个值是不确定的,这也就是每次调用时都会看到不同结果的原因)
例如:函数getNumPoint的主要功能是返回变量m_pos的长度,但是该函数最终返回的类型是const 引用类型。

const TSize& TComPointCloud::getNumPoint() const
{
    
    
  return m_pos.size();
}

下面我们来分析一下这个函数错误的原因,该函数每次调用都会调用变量m_pos的一个内部函数size(),而该函数返回的变量是一个临时变量temp,该临时变量的有效域也就仅仅限制与函数getNumPoint作用域,也就是当函数getNumPoint调用return语句之后,改变量就会被销毁,但是我们现在返回的是一个引用类型,也就是返回值是绑定在该临时变量上,一旦该临时变量被销毁,就会导致返回的引用变量是一个不可预估的数值。
所以正确的做法是,将该函数的返回类型定义为一个const变量。

const TSize TComPointCloud::getNumPoint() const
{
    
    
  return m_pos.size();
}

这样函数调用返回类型是一个变量,也就是将改变量复制给另外一个变量之后被销毁,因为是复制,两个变量之间是相互独立的。

猜你喜欢

转载自blog.csdn.net/weixin_44312010/article/details/102767914