Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 理解构造函数在移动、复制、分配语义中的行为_C++_Constructor_Semantics - Fatal编程技术网

C++ 理解构造函数在移动、复制、分配语义中的行为

C++ 理解构造函数在移动、复制、分配语义中的行为,c++,constructor,semantics,C++,Constructor,Semantics,这是一个输出C-TOR和D-TOR以及移动/复制操作的最小程序 令我感兴趣的是,输出中只有一个C-tor,尽管在显示的范围D-tor末尾有三个实体被销毁 那么为什么只显示一个C-tor呢?我们如何处理这些问题,或者如果我有误解,我们应该知道些什么 #include <iostream> class Subject{ public: Subject(){ std::cout<<"Default C-tor"<<std::endl;

这是一个输出C-TOR和D-TOR以及移动/复制操作的最小程序

令我感兴趣的是,输出中只有一个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;
}
它将通过调用默认构造函数来工作

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

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

尽管有三个实体被摧毁

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

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


另外,您的移动赋值和构造函数实际上不会移动成员,因为您使用了常量引用作为参数。

移动构造函数和移动赋值应该采用&&,而不是常量&&。
   Subject copySubject{};

   Subject moveSubject{};
Subject subject{42};