const或ref或const ref或value作为setter函数的参数

时间:2015-07-14 09:29:21

标签: c++ c++11 parameter-passing

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。可能是函数的主体在某些情况下是不正确的。

2 个答案:

答案 0 :(得分:7)

  1. 按值传递:通常不太好,因为可能会采用值副本。 (虽然移动构造函数可能会缓解)。

  2. 通过引用传递:不好,因为函数可能修改传递的参数。此外,匿名临时无法绑定到引用。

  3. 通过const参考:仍然是最好的。没有复制,函数无法修改参数,匿名临时可以绑定到const引用。

  4. 通过&&变体传递:目前毫无意义,因为根据您编写函数体的方式,没有移动语义。如果你用std::move(m_parameter, parameter)代替作业,那么在某些情况下这可能会胜过(3),编译器会选择更好的。

答案 1 :(得分:1)

参见'Effective C ++'Scott Meyers - 如果私有成员是内置类型,那么传递值比传递引用(通常在编译器中实现为指针)更有效。对于STL中的迭代器和函数对象也是如此,它们被设计为通过值传递。否则优选通过引用传递给const。