我总是const T&
用来将一个类传递给一个函数。像这样:
void foo(const MyType& p)
{
//...
}
但是现在我很困惑,为什么不将 aconst T
或 aT&
传递给函数呢?
顺便说一句,对于内置类型,例如int
, long long
, double
, 为什么const T
比const T&
(我记得我读过Effective C++)
谢谢回答我的问题。
我总是const T&
用来将一个类传递给一个函数。像这样:
void foo(const MyType& p)
{
//...
}
但是现在我很困惑,为什么不将 aconst T
或 aT&
传递给函数呢?
顺便说一句,对于内置类型,例如int
, long long
, double
, 为什么const T
比const T&
(我记得我读过Effective C++)
谢谢回答我的问题。
您可以通过这三个中的任何一个(const T、T&或const T&)。它们都有不同的含义。是否要传递无法修改的对象副本、对对象的非常量引用或对对象的 const 引用,由您决定。您选择的内容取决于代码的语义。总体而言,您需要选择const T&
overconst T
以避免将值从调用者复制到此函数(节省时间和内存)。此外(根据这个有用的链接),只要你想避免改变值和状态,你就会想使用const T&
overT&
传递的参考。这可以防止愚蠢和被忽视的编码错误,例如为了测试目的而更改字段。
关于将 const 原始类型的引用作为参数传递的问题,请参见:C++ and QT4.5 - is passing a const int& overkill? 通过引用传递是否有助于信号/插槽?
const T 是按值传递的(需要复制),这对于一个类来说可能太多了,而对于内置类型来说应该没问题。
T& 是通过引用传递的,可以在函数中修改,而 const T& 不能,所以这取决于你需要做什么。
(我记得我读过 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&
. 对于一些便宜的类型,不按价值考虑没有什么意义,因为您事先知道复制很便宜。
您始终通过 const 引用传递的规则过于笼统。
通过 const 引用传递通常表明
如果您需要不同的东西,那么您应该选择其他东西而不是通过 const 引用传递。