是否有传递构造函数参数的首选做法?特别是如果这些构造函数参数用于初始化成员变量。
一个简化的例子。
class Example
{
public:
Example( /*type-1*/ str, /*type-2*/ v ):
m_str( str ),
m_v( v )
{ }
/* other methods */
private:
std::string m_str;
std::complex<float> m_v;
};
选项包括:
std::move
对象加入成员。const&
,然后将参数复制到成员中。&&
,然后使用参数初始化成员。我的默认/首选参数传递方式应该是什么?
它是否随着不同的参数类型而改变?
我的直觉说使用rvalue-references,但我不确定我是否了解所有的优点和缺点。
答案 0 :(得分:6)
选项1:
class Example
{
public:
Example( std::string str, const std::complex<float>& v ):
m_str( std::move(str) ),
m_v( v )
{ }
/* other methods */
private:
std::string m_str;
std::complex<float> m_v;
};
这具有非常好的性能并且易于编码。当你将左值绑定到str
时,它与最佳值相差一个地方。在这种情况下,您执行复制构造和移动构造。最佳只是复制结构。请注意,std::string
的移动构造应该非常快。所以我会从这开始。
但是,如果您真的需要将最后一个周期拉出来以获得性能,您可以这样做:
选项2:
class Example
{
public:
Example( const std::string& str, const std::complex<float>& v ):
m_str( str ),
m_v( v )
{ }
Example( std::string&& str, const std::complex<float>& v ):
m_str( std::move(str) ),
m_v( v )
{ }
/* other methods */
private:
std::string m_str;
std::complex<float> m_v;
};
此选项的主要缺点是必须重载/复制构造函数逻辑。实际上,如果您需要在const&
和&&
之间重载多于一个或两个参数,则此公式将变得不切实际。