我实现了复制构造函数和移动构造函数,我学到的是程序必须使用移动构造函数而不是复制构造函数。
class Move
{
private:
int *data; // raw pointer
public:
Move(int); // constructor
Move(const Move &source); // copy constructor
Move(Move &&source); // Move Constructor
~Move();
};
Move::Move(int d)
{
data = new int;
*data = d;
cout << "Constructor for: " << d << endl;
}
Move::Move(const Move &source)
: Move(*source.data)
{
cout << "Copy constructor -deep copy for: " << *data << endl;
}
Move::Move(Move &&source)
: data{source.data}
{
source.data = nullptr;
cout << "Move constructor -Moving resource: " << *data << endl;
}
Move::~Move()
{
if (data != nullptr)
{
cout << "Destructor freeing data for : " << *data << endl;
}
else
{
cout << "Destructor freeing data for nullptr" << endl;
}
delete data;
}
//driving function
int main()
{
vector<Move> vec;
vec.push_back(Move{10});
vec.push_back(Move{20});
vec.push_back(Move{30});
vec.push_back(Move{40});
vec.push_back(Move{50});
vec.push_back(Move{60});
vec.push_back(Move{70});
return 0;
}输出:
构造函数: 10
移动构造函数-Moving资源: 10
释放nullptr数据的析构函数
构造函数: 20
移动构造函数-Moving资源: 20
构造函数: 10
复制构造函数-deep副本: 10
释放数据的析构函数为: 10
释放nullptr数据的析构函数
构造函数: 30
移动构造函数-Moving资源: 30
构造函数: 10
复制构造函数-deep副本: 10
构造函数: 20
复制构造函数-deep副本: 20
释放数据的析构函数为: 10
为: 20释放数据的析构函数
释放nullptr数据的析构函数
构造函数: 40
移动构造函数-Moving资源: 40
释放nullptr数据的析构函数
构造函数: 50
移动构造函数-Moving资源: 50
构造函数: 10
复制构造函数-deep副本: 10
构造函数: 20
复制构造函数-deep副本: 20
构造函数: 30
复制构造函数-deep副本: 30
构造函数: 40
复制构造函数-deep副本: 40
释放数据的析构函数为: 10
为: 20释放数据的析构函数
为: 30释放数据的析构函数
为: 40释放数据的析构函数
释放nullptr数据的析构函数
构造函数: 60
移动构造函数-Moving资源: 60
释放nullptr数据的析构函数
构造函数: 70
移动构造函数-Moving资源: 70
释放nullptr数据的析构函数
释放数据的析构函数为: 10
为: 20释放数据的析构函数
为: 30释放数据的析构函数
为: 40释放数据的析构函数
释放数据的析构函数为: 50
为: 60释放数据的析构函数
释放数据的析构函数为: 70
发布于 2022-05-12 05:30:04
因为std::向量移动,而只有当您有一个 you,除了移动构造函数时,才会调整大小。也可以调用vec.reserve(7)以避免调整大小。
https://stackoverflow.com/questions/72210101
复制相似问题