我有一个数组类,我抓住了一个网站,给出了一个移动构造函数的例子。然而,如何在示例程序中实现此移动构造函数?我觉得我理解函数定义,但我不知道如何在程序中使用它。
class ArrayWrapper
{
public:
// default constructor produces a moderately sized array
ArrayWrapper ()
: _p_vals( new int[ 64 ] )
, _size( 64 )
{}
ArrayWrapper (int n)
: _p_vals( new int[ n ] )
, _size( n )
{}
// move constructor, how does this come in handy?
ArrayWrapper (ArrayWrapper&& other)
: _p_vals( other._p_vals )
, _size( other._size )
{
other._p_vals = NULL;
}
// copy constructor
ArrayWrapper (const ArrayWrapper& other)
: _p_vals( new int[ other._size ] )
, _size( other._size )
{
for ( int i = 0; i < _size; ++i )
{
_p_vals[ i ] = other._p_vals[ i ];
}
}
~ArrayWrapper ()
{
delete [] _p_vals;
}
private:
int *_p_vals;
int _size;
};
答案 0 :(得分:2)
然而,如何在示例程序中实现此移动构造函数?
我认为你的代码已经显示出来了。
我觉得我理解函数定义,但我不知道如何在程序中使用它。
只需使用以下几种方法之一即可触发移动。例如:
ArrayWrapper aw;
ArrayWrapper aw2 = std::move(aw);
甚至:
ArrayWrapper foo()
{
ArrayWrapper aw;
//...
return aw;
}
// ...
ArrayWrapper aw2 = foo();
请注意,在最后一种情况下,编译器可能会忽略对移动构造函数的调用。
答案 1 :(得分:1)
它用于与复制构造函数相同的情况,但仅在复制的表达式是rvalue时才使用。右值通常是指临时对象。因此,例如,如果您有一个函数foo
按值返回ArrayWrapper
,则调用该函数的表达式将是一个右值。
ArrayWrapper aw = foo();
这里,ArrayWrapper
对象将由foo
返回的临时对象构造。选择移动构造函数重载是因为rvalue引用参数绑定到rvalue表达式。
移动构造函数通常会使正在移动的对象处于有效但不确定的状态。