我最近开始学习移动语义和共享指针,我在尝试理解它时遇到了很多困难。
我目前正在学习这些主题的课程,但是教师没有解释为什么在交换指针中包含的值时会调用这些构造函数和析构函数。调用交换共享指针(如b.swap(a))和std :: swap(a,b)不调用任何构造函数或析构函数,而调用std :: swap(* a,*) b)正在打电话给他们。
主要代码:
int main(int argc, char** argv){
std::shared_ptr<strc> a = std::make_shared<strc>("one");
std::shared_ptr<strc> b = std::make_shared<strc>("two");
message("b.swap(a)"); // No constructors or destructors are called.
b.swap(a);
disp(a);
disp(b);
message("std::swap"); // A bunch of constructors and destructors are called.
std::swap(*a, *b);
disp(a);
disp(b);
message("std::swap"); // No constructor or destructors are called.
std::swap(a, b);
disp(a);
disp(b);
return 0;
}
&#34; strc&#34;的实施类是(为了简明起见,我将展示其中的重要&#39;实现):
strc::strc(strc && o){
msg("Move Constructor.");
this->data = std::move(o.data);
o.data = nullptr;
}
strc::~strc(){
msg("Destructor.");
delete [] data;
}
strc & strc::operator = (strc o){
msg("Copy and Swap (=).");
swap(o);
return *this;
}
void strc::swap(strc & o){
msg("Calling std::swap");
std::swap(this->data, o.data);
}
这是打印到控制台的内容(让我更多地了解正在发生的事情,并彻底了解移动语义和共享指针)。
调用b.swap(a) 一(1) 二(1)
调用std :: swap(* a,* b) strc:移动构造函数。 strc:移动构造函数。 strc:复制和交换(=)。 strc:调用std :: swap strc:析构函数。 strc:移动构造函数。 strc:复制和交换(=)。 strc:调用std :: swap strc:析构函数。 strc:析构函数。 二(1) 一(1)
调用std :: swap(a,b) 一(1) 二(1)
为什么?它与移动语义有关吗?不应该调用标准交换功能吗?我无法理解这些交换调用之间的区别,以及为什么其中一个调用所有这些构造函数和析构函数。