4

我总是const T&用来将一个类传递给一个函数。像这样:

void foo(const MyType& p)
{
  //...
}

但是现在我很困惑,为什么不将 aconst T或 aT&传递给函数呢?

顺便说一句,对于内置类型,例如int, long long, double, 为什么const Tconst T& (我记得我读过Effective C++

谢谢回答我的问题。

4

4 回答 4

8

您可以通过这三个中的任何一个(const T、T&const T&)。它们都有不同的含义。是否要传递无法修改的对象副本、对对象的非常量引用或对对象的 const 引用,由您决定。您选择的内容取决于代码的语义。总体而言,您需要选择const T&overconst T以避免将值从调用者复制到此函数(节省时间和内存)。此外(根据这个有用的链接),只要你想避免改变状态,你就会想使用const T&overT&传递的参考。这可以防止愚蠢和被忽视的编码错误,例如为了测试目的而更改字段。

关于将 const 原始类型的引用作为参数传递的问题,请参见:C++ and QT4.5 - is passing a const int& overkill? 通过引用传递是否有助于信号/插槽?

于 2012-08-04T02:16:02.340 回答
1

const T 是按值传递的(需要复制),这对于一个类来说可能太多了,而对于内置类型来说应该没问题。

T& 是通过引用传递的,可以在函数中修改,而 const T& 不能,所以这取决于你需要做什么。

于 2012-08-04T02:11:14.487 回答
0

(我记得我读过 Effective C++)

不,你不会,因为斯科特迈耶斯不会犯这样的错误。

const T&是最好的选择,因为它从不涉及副本,但仍然可以采用右值。考虑

void foo(int& p);
void foo(const std::string s);
int main() { 
    foo(1); // illegal!
    foo("A reaaaaaaaallllllllllllllllllllllllllllllllllllllllllly long string");
    // Nasty copy
}

如果您需要一个项目的副本,请在参数列表中创建一个(按值取值),但这个值几乎没有理由是const. 否则,使用const T&. 对于一些便宜的类型,不按价值考虑没有什么意义,因为您事先知道复制很便宜。

于 2012-08-04T02:08:57.110 回答
0

您始终通过 const 引用传递的规则过于笼统。

通过 const 引用传递通常表明

  • 该方法不会修改参数
  • 该方法可能不会声明对参数的所有权
  • 调用者保证参数的生命周期将比调用长

如果您需要不同的东西,那么您应该选择其他东西而不是通过 const 引用传递。

于 2012-08-04T02:10:57.077 回答