将const引用传递给基本类型有什么用?

for*_*idt 15 c++ primitive const reference

在我维护的项目中,我看到很多代码都是这样的简单get/ set方法

const int & MyClass::getFoo() { return m_foo; }

void MyClass::setFoo(const int & foo) { m_foo = foo; }
Run Code Online (Sandbox Code Playgroud)

这样做有什么意义而不是以下几点?

int MyClass::getFoo() { return m_foo; }  // Removed 'const' and '&' 

void MyClass::setFoo(const int foo) { m_foo = foo; }  // Removed '&'
Run Code Online (Sandbox Code Playgroud)

传递对基本类型的引用应该需要与传递类型的值本身相同(或更多)的努力,对吧?
毕竟这只是一个数字......
这只是一些尝试的微观优化还是有真正的好处?

Bri*_*ndy 20

不同之处在于,如果您自己将结果导入引用,则可以在不调用函数的情况下跟踪自己的变量名中整数成员变量的更改.

const &int x = myObject.getFoo();
cout<<x<<endl;
//...
cout<<x<<endl;//x might have changed
Run Code Online (Sandbox Code Playgroud)

它可能不是最好的设计选择,如果返回一个从范围中释放的变量,返回引用(const或不是const)是非常危险的.因此,如果您返回引用,请注意确保它不是超出范围的变量.

修饰符也有细微的差别,但也可能不值得做或有意.

void test1(int x)
{
  cout<<x<<endl;//prints 1
}

void test2(const int &x)
{
  cout<<x<<endl;//prints 1 or something else possibly, another thread could have changed x
}

int main(int argc, char**argv)
{
  int x = 1;
  test1(x);
  //...
  test2(x);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

因此,最终结果是即使在传递参数后您也会获得更改.


Man*_*anu 7

对我来说,传递一个const基元的参考是一个错误.您需要修改该值,在这种情况下,您传递一个非const引用,或者您只需要访问该值,在这种情况下,您传递一个const.

当复制对象可能是性能问题时,Const引用只应用于复杂类.在基元的情况下,除非您需要修改变量的值,否则不应传递引用.原因是引用引用需要更多的计算时间,因为对于引用,程序需要在表中查找以查找对象的地址.当查找时间短于复制时间时,引用是一种改进.

通常,在低级实现中,int地址具有相同的字节长度.因此,将int复制为函数的返回值的时间等于复制地址的时间.但是在返回int的情况下,不执行查找,因此性能提高.


sha*_*oth 5

返回值和返回const引用之间的主要区别在于,您可以const_cast引用并更改值.

这是一个糟糕的设计和尝试创建智能设计的一个例子,简单而简洁的设计将绰绰有余.作者不仅仅返回一个值,而是让代码的读者思考他可能有什么意图.