我已經實作了復制建構式和移動建構式,我學到的是程式必須使用移動建構式而不是復制建構式。
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
移動建構式 - 移動資源:10
為 nullptr 釋放資料的解構式
建構式:20
移動建構式 - 移動資源:20
建構式:10
復制建構式 -deep copy for: 10
解構式釋放資料:10
為 nullptr 釋放資料的解構式
建構式:30
移動建構式 - 移動資源:30
建構式:10
復制建構式 -deep copy for: 10
建構式:20
復制建構式-deep copy for: 20
解構式釋放資料:10
解構式釋放資料:20
為 nullptr 釋放資料的解構式
建構式:40
移動建構式 - 移動資源:40
為 nullptr 釋放資料的解構式
建構式:50
移動建構式 - 移動資源:50
建構式:10
復制建構式 -deep copy for: 10
建構式:20
復制建構式-deep copy for: 20
建構式:30
復制建構式 -deep copy for: 30
建構式:40
復制建構式-deep copy for: 40
解構式釋放資料:10
解構式釋放資料:20
解構式釋放資料:30
解構式釋放資料:40
為 nullptr 釋放資料的解構式
建構式:60
移動建構式 - 移動資源:60
為 nullptr 釋放資料的解構式
建構式:70
移動建構式-移動資源:70
為 nullptr 釋放資料的解構式
解構式釋放資料:10
解構式釋放資料:20
解構式釋放資料:30
解構式釋放資料:40
解構式釋放資料:50
解構式釋放資料:60
解構式釋放資料:70
uj5u.com熱心網友回復:
因為只有當你有一個noexcept移動建構式時,std::vector 才會在調整大小時移動。或者你可以打電話vec.reserve(7)來避免調整大小。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/472700.html
上一篇:如何遍歷具有不同型別的多個向量?
