我正在研究C ++ 11中的移动语义,我很好奇如何在构造函数中移动基本类型,如boolean,integer float等。复合类型也像std :: string。
以下面的课程为例:
class Test
{
public:
// Default.
Test()
: m_Name("default"), m_Tested(true), m_Times(1), m_Grade('B')
{
// Starting up...
}
Test(const Test& other)
: m_Name(other.m_Name), m_Times(other.m_Times)
, m_Grade(other.m_Grade), m_Tested(other.m_Tested)
{
// Duplicating...
}
Test(Test&& other)
: m_Name(std::move(other.m_Name)) // Is this correct?
{
// Moving...
m_Tested = other.m_Tested; // I want to move not copy.
m_Times = other.m_Times; // I want to move not copy.
m_Grade = other.m_Grade; // I want to move not copy.
}
~Test()
{
// Shutting down....
}
private:
std::string m_Name;
bool m_Tested;
int m_Times;
char m_Grade;
};
如何移动(不复制)m_Tested,m_Times,m_Grade。并且m_Name是否正确移动?谢谢你的时间。
答案 0 :(得分:6)
从prvalue或xvalue原语初始化和赋值,与初始化或从左值原语赋值完全相同;复制值并且源对象不受影响。
换句话说,您可以使用std::move
,但它不会有任何区别。
如果你想改变源对象的值(比如说0
),你必须自己做。
答案 1 :(得分:1)
看起来正确。除了像bool这样的简单数据类型,int,char只能被复制。 “移动”一个字符串的要点是它有一个缓冲区,它通常在构造一个新对象时必须复制,但是当移动旧缓冲区时(复制指针而不是缓冲区的内容)。
Test(Test&& other)
: m_Name(std::move(other.m_Name)), m_Times(other.m_Times)
, m_Grade(other.m_Grade), m_Tested(other.m_Tested)
{}