Constantness
class MyClass {
// ...
private:
std::string m_parameter;
// ...
}
传递通过值:
void MyClass::SetParameter(std::string parameter)
{
m_parameter = parameter;
}
传递通过-REF:
void MyClass::SetParameter(std::string& parameter)
{
m_parameter = parameter;
}
传递由const的-REF:
void MyClass::SetParameter(const std::string& parameter)
{
m_parameter = parameter;
}
传递由const的值:
void MyClass::SetParameter(const std::string parameter)
{
m_parameter = parameter;
}
传递由万能-REF:
void MyClass::SetParameter(std::string&& parameter)
{
m_parameter = parameter;
}
传递由const的万能-REF:
void MyClass::SetParameter(const std::string&& parameter)
{
m_parameter = parameter;
}
哪种变体最好(可能就C ++ 11及其移动语义而言)?
PS。可能是函数的主体在某些情况下是不正确的。
答案 0 :(得分:7)
按值传递:通常不太好,因为可能会采用值副本。 (虽然移动构造函数可能会缓解)。
通过引用传递:不好,因为函数可能修改传递的参数。此外,匿名临时无法绑定到引用。
通过const
参考:仍然是最好的。没有复制,函数无法修改参数,匿名临时可以绑定到const
引用。
通过&&
变体传递:目前毫无意义,因为根据您编写函数体的方式,没有移动语义。如果你用std::move(m_parameter, parameter)
代替作业,那么在某些情况下这可能会胜过(3),编译器会选择更好的。
答案 1 :(得分:1)
参见'Effective C ++'Scott Meyers - 如果私有成员是内置类型,那么传递值比传递引用(通常在编译器中实现为指针)更有效。对于STL中的迭代器和函数对象也是如此,它们被设计为通过值传递。否则优选通过引用传递给const。