了解构造函数在移动、复制、赋值语义中的行为

Understanding the behavior of constructors in move, copy, assign semantics

本文关键字:语义 复制 构造函数 移动 了解 赋值      更新时间:2023-10-16

这是一个最小的程序,它输出C-tors和D-tors,也是移动/复制操作。

令我感兴趣的是,输出中只有一个 C-tor,尽管在示波器结束时有三个实体被销毁(显示 D-tor(。

那么为什么只显示一个 C-tor ?以及我们如何处理它(显示它们(,或者如果我有误解,我们应该知道什么。

#include <iostream>
class Subject{
public:
Subject(){
std::cout<<"Default C-tor"<<std::endl;
}
Subject(int data):mdata(data){
std::cout<<"C-tor"<<std::endl;
}
virtual~Subject(){
std::cout<<"D-tor"<<std::endl;
}

Subject(Subject const& subject): mdata(subject.mdata){
std::cout<<"Object copied"<<std::endl;
}
Subject& operator=(Subject const& subject){
if(this != &subject){
mdata=subject.mdata;
std::cout<<"Object copied"<<std::endl;
}
return *this;
}
Subject(Subject const&& subject): mdata(std::move(subject.mdata)){
std::cout<<"Object moved"<<std::endl;
}
Subject& operator=(Subject const&& subject){
if(this != &subject){
mdata=std::move(subject.mdata);
std::cout<<"Object moved"<<std::endl;
}
return *this;
}
friend std::ostream& operator<<(std::ostream& out, Subject const& subject){
out<<subject.mdata<<std::endl;
return out;
}
protected:
int mdata;
};
int main()
{
Subject subject{42};
Subject copySubject{subject};
Subject moveSubject = std::move(subject);
return 0;
}

请注意,如果我声明copySubjectmoveSubject,例如:

Subject copySubject{};
Subject moveSubject{};

它将通过调用默认构造函数来工作。

那么为什么只显示一个 C-tor 呢?

因为您曾经使用过转换 int 构造函数,所以当您在此处直接初始化时:

Subject subject{42};

尽管有三个实体被摧毁

另外两个对象分别是使用复制构造函数和移动构造函数创建的。请注意,这些构造函数都不显示"C-tor"。

您已经定义了三个变量,因此创建和销毁三个对象也就不足为奇了。


附言您的移动赋值和构造函数实际上并没有移动成员,因为您使用了 const 引用作为参数。