虽然我提供了移动构造函数,但调用了复制构造函数
我已经实现了复制构造函数和移动构造函数,我学到的是该程序必须使用移动构造函数而不是复制构造函数。
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
MOVE构造函数 - 移动资源:10
驱动器释放NULLPTR
构造函数的释放数据:20
MOVE构造函数 - 移动资源:20
构造函数:10
copy构造函数:10 cople构造
函数 - for:10 destructor for:10 destructor for for:10
dostructor for dostructor freetructor fireing freetaring数据对于NULLPTR
构造函数:30
MOVE构造函数 - 移动资源:30
构造函数
:10复制
构造函数-Deep -Deep copy for:10构造函数:20
copy构造函数:20
destructor for:20 destructor freeing数据的数据:10 destructor foreforing for:20
for:20 destructor for:20
destructor:20 destructor 释放NULLPTR构造函数的数据
:40
MOVE构造函数 - 移动资源:40
的释放数据
destructor for NullPtr构造函数
:50 MOVE构造函数 - 移动资源:50
构造函数:10
copy构造函数:10 copy构造函数-10构造函数:10
copy构造函数:20
复制构造函数:深副本:20
构造函数:30
复制构造函数-DEEP副本:30
构造函数:40
复制构造函数-Deep copy for:40
destructructor freeder数据的数据:10
destructructor free -freening for:20
destructor free -deStructor freeder free数据:30
destructructor notsructor noterricing数据for:40
destructor for NullPTR构造函数的释放数据
:60
移动构造函数 - 移动资源:60
NULLPTR
构造函数的60 nullptr构造函数的免费数据:70
移动构造函数 - 移动资源:70
驱动器释放
数据,用于NULLPTR destructor foreator for:10
deStructor for: 10 :20
驱动器释放数据:30
DESTRUCTOR免费数据:40
DESTRUCTOR FREETER数据的数据:50
DESTRUCTOR FREETRUCTOR数据:60
DESTRUCTRUCTOR免费数据:70
I have implemented both copy constructor and move constructor and what i learned was the program must use Move constructor instead of copy constructor .
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;
}
Output:
Constructor for: 10
Move constructor -Moving resource: 10
Destructor freeing data for nullptr
Constructor for: 20
Move constructor -Moving resource: 20
Constructor for: 10
Copy constructor -deep copy for: 10
Destructor freeing data for : 10
Destructor freeing data for nullptr
Constructor for: 30
Move constructor -Moving resource: 30
Constructor for: 10
Copy constructor -deep copy for: 10
Constructor for: 20
Copy constructor -deep copy for: 20
Destructor freeing data for : 10
Destructor freeing data for : 20
Destructor freeing data for nullptr
Constructor for: 40
Move constructor -Moving resource: 40
Destructor freeing data for nullptr
Constructor for: 50
Move constructor -Moving resource: 50
Constructor for: 10
Copy constructor -deep copy for: 10
Constructor for: 20
Copy constructor -deep copy for: 20
Constructor for: 30
Copy constructor -deep copy for: 30
Constructor for: 40
Copy constructor -deep copy for: 40
Destructor freeing data for : 10
Destructor freeing data for : 20
Destructor freeing data for : 30
Destructor freeing data for : 40
Destructor freeing data for nullptr
Constructor for: 60
Move constructor -Moving resource: 60
Destructor freeing data for nullptr
Constructor for: 70
Move constructor -Moving resource: 70
Destructor freeing data for nullptr
Destructor freeing data for : 10
Destructor freeing data for : 20
Destructor freeing data for : 30
Destructor freeing data for : 40
Destructor freeing data for : 50
Destructor freeing data for : 60
Destructor freeing data for : 70
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
因为STD ::向量在调整大小的同时仅在您具有 noexcept 移动构造函数时进行调整。
或者,您可以调用
vec.Reserve(7)
避免调整大小。Because std::vector moves while resizing only if you have a noexcept move constructor.
Or you can call
vec.reserve(7)
to avoid resizing.