我经常不确定何时应该引用,何时应该使用变量传递。例如,JOBJECTs调用其中一个API:
QLIST retrive_cinemas(QString& options)
{
return (staticobject::getcinemas(options));
}
或者
QLIST retrive_cinemas(QString options)
{
return (staticobject::getcinemas(options));
}
我经常不确定何时应该引用,何时应该使用变量传递。例如,JOBJECTs调用其中一个API:
QLIST retrive_cinemas(QString& options)
{
return (staticobject::getcinemas(options));
}
或者
QLIST retrive_cinemas(QString options)
{
return (staticobject::getcinemas(options));
}
我觉得你的问题可以简化为以下内容:
你有一个函数/方法
f()
,还有一个类X
,你想知道何时应该将X
作为引用传递给f()
。
你可以确定三个选项:
void f(X v) // #1 - pass by value
void f(const X& cr) // #2 - pass by const reference (&)
void f(X& r) // #3 - pass by reference (&)
X
是容易复制的(例如它是一个 int
,一个 double
等),并且您不想修改它,则通过值传递 (#1)。如果 X
不容易复制(例如它是一个 vector
,一个 string
等),并且您不想修改它,则通过 const 引用传递 (#2)。如果您想要在 f()
中修改类型为 X
的参数,则通过引用传递。
QString
是一个完整的类,与例如int
或double
相比,它不便宜(即使它使用COW技术和“隐式共享”,我认为复制仍然意味着调用类似于Win32InterlockedIncrement()
这样的东西来以线程安全的原子方式增加引用计数),如果您不想在函数内部修改它,则应该通过const
引用(即const QString &
,#2)传递它。QString&
,#3)。QString
仍然非常便宜易于复制。引用计数使用原子增量和减量,这比使用锁实现的线程安全更快。因此,它真的并不是那么“糟糕”。 - dtechint
或者double
是_便宜_的复制对象。涉及调用交换原子操作(例如Win32 InterlockedIncrement()
)的内容则_不是_便宜的复制对象,或者至少比简单的const&
传递 更加昂贵。 - Mr.C64
void someMethod(TYPE *parameter)
,请使用指针。您的变量本身可以是一个指针:TYPE *option1; TYPE option2;
。如果参数和选项都是指针(有星号),只需使用someMethod(option1);
。否则,请使用someMethod(&option2);
。 - Sebastian LangeQString
使用了写时复制(隐式共享)语义。 - cmannett85