传递构造函数的首选参数
Preferred parameter passing for constructors
是否有传递构造函数参数的首选实践?特别是当这些构造函数参数用于初始化成员变量时。
一个简化的例子。
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&
,然后将参数复制到成员中。 -
&&
,然后用该参数初始化成员
我的默认/首选参数传递样式应该是什么?
它是否随着参数类型的不同而改变?
我的直觉告诉我使用右值引用,但我不确定我理解所有的优点和缺点。
选项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&
和&&
之间重载一个或两个以上的参数,这个公式将变得不现实。
相关文章:
- C++:使用运算符 = 调用多参数构造函数
- 通过零参数构造函数创建的 glm::mat4 应该包含哪些值?
- 好奇的混合与可变参数构造函数
- 具有默认值的单个参数构造函数是否与默认构造函数相同?
- 为什么我们需要创建一个单参数构造函数来使用临时的无名称对象
- 在可变参数构造函数中初始化常量数组
- C++ 显式多参数构造函数歧义
- 零一参数构造函数
- 可变参数构造函数中的 SFINAE
- 当没有显式关键字与单参数构造函数一起使用时,编译器可以发出警告
- 可变参数类模板和可变参数构造函数
- 确保模板参数类型与其可变参数构造函数的类型匹配
- C++默认参数构造函数与内联初始化优先级
- 如何在 c++ 中将包含复制构造函数的类的参数构造函数称为私有?
- 自动存储中没有无参数构造函数的类对象和异常
- 警告:用两个参数构造函数返回对象时,表达结果未使用
- 如何在C++中调用无参数构造函数
- 在 c++ 中具有多个参数构造函数的模板类存在问题
- 可变参数构造函数优先于用户提供的移动构造函数,除非默认
- 如何从可变参数构造函数参数构造任何对象?