我总是使用const T&
将类传递给函数。像这样:
void foo(const MyType& p)
{
//...
}
但现在我很困惑,为什么不将const T
或T&
传递给函数?
顺便说一下,对于内置类型,例如int
,long long
,double
,为什么const T
优于const T&
(我记得我读过 Effective C ++ )
感谢您回答我的问题。
答案 0 :(得分:4)
你可以传递三个中的任何一个( const T,T&,或 const T& )。它们都有不同的含义。由您决定是否要传递无法修改的对象的副本,对象的非const引用或对象的const引用。您选择的内容取决于代码的语义。总的来说,您希望选择const T&
而不是const T
,以避免将值从调用者复制到此函数(节省时间和内存)。此外(根据this helpful link),只要您希望避免同时更改值和状态,就可以使用const T&
而不是T&
传递的引用。这可以防止愚蠢和被忽视的编码错误,例如更改字段以进行测试。
有关将参数作为参数传递给const基元类型的问题,请参阅:C++ and QT4.5 - is passing a const int& overkill? Does pass by reference helps in signals/slots?
答案 1 :(得分:0)
(我记得我读过有效的C ++)
不,你没有,因为斯科特迈耶斯不会犯这样的错误。
const T&
是最好的选择,因为它从不涉及副本,但仍然可以使用rvalues。考虑
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&
。对于一些便宜的类型而言,没有必要按价值收取价值,因为你事先知道复制很便宜。
答案 2 :(得分:0)
总是通过const引用传递的规则过于笼统。
通过const引用传递通常表示
如果您需要不同的东西,那么您应该选择除了通过const引用之外的其他东西。
答案 3 :(得分:0)
const T按值传递(需要复制),对于类来说可能太多了,而对于内置类型则应该没问题。
T&安培;通过引用传递,可以在函数中修改,而const T&不能,所以这取决于你需要做什么。