复制构造函数和移动构造函数如何工作
How copy constructor and move constructor work
我的问题是了解这两个构造函数的工作原理。
我有这个 class:
class moveClass
{
int variabile;
public:
moveClass(){}
//move constructor
moveClass(moveClass && arg)
{
cout<<"Call move constructor"<<endl;
variabile = arg.variabile;
}
//copy constructor
moveClass(const moveClass & arg)
{
cout<<"Call copy constructor"<<endl;
variabile = arg.variabile;
}
};
据我了解,当我实例化此 class 的新对象时,会根据参数的类型调用构造函数。
移动构造函数的优点是,当使用右值实例化对象时,不会复制该对象,而只是移动它。
1 moveClass a;
2 moveClass b = a;
3 moveClass c = std::move(a);
考虑到这个例子,我可以说当我实例b时,a被复制,然后分配给b吗?
换句话说,直到第 2 行,我的内存中将有 3 个对象:
a、b 和 a_copy.
而第 3 行只会创建 c 对象,不会创建新的副本对象。
基本上在这三行的末尾我将在内存中有 4 个对象。
这是正确的吗?
构造函数的代码也是相同的,所以我希望唯一的区别是传递的参数类型。
In other words up until line 2 i will have 3 objects in memory: a, b and a_copy.
没有
moveClass b = a;
与
相同
moveClass b(a);
因此,b
的复制构造函数被调用,您直接将成员从a
复制到b
,不会生成临时(复制)。
最后你只构建了 3 个对象,a
、b
和 c
。
我的问题是了解这两个构造函数的工作原理。 我有这个 class:
class moveClass
{
int variabile;
public:
moveClass(){}
//move constructor
moveClass(moveClass && arg)
{
cout<<"Call move constructor"<<endl;
variabile = arg.variabile;
}
//copy constructor
moveClass(const moveClass & arg)
{
cout<<"Call copy constructor"<<endl;
variabile = arg.variabile;
}
};
据我了解,当我实例化此 class 的新对象时,会根据参数的类型调用构造函数。
移动构造函数的优点是,当使用右值实例化对象时,不会复制该对象,而只是移动它。
1 moveClass a;
2 moveClass b = a;
3 moveClass c = std::move(a);
考虑到这个例子,我可以说当我实例b时,a被复制,然后分配给b吗?
换句话说,直到第 2 行,我的内存中将有 3 个对象: a、b 和 a_copy.
而第 3 行只会创建 c 对象,不会创建新的副本对象。
基本上在这三行的末尾我将在内存中有 4 个对象。 这是正确的吗?
构造函数的代码也是相同的,所以我希望唯一的区别是传递的参数类型。
In other words up until line 2 i will have 3 objects in memory: a, b and a_copy.
没有
moveClass b = a;
与
相同moveClass b(a);
因此,b
的复制构造函数被调用,您直接将成员从a
复制到b
,不会生成临时(复制)。
最后你只构建了 3 个对象,a
、b
和 c
。