了解构造函数在移动,复制,分配语义中的行为

问题描述 投票:0回答:1

这里是一个最小程序,可输出C-tor和D-tor,以及移动/复制操作。

令我着迷的是,尽管在示波器范围内有三个实体被销毁(显示的是D-tors),但输出中只有一个C-tors。

那么为什么只显示一个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和D-tor,以及移动/复制操作。令我感兴趣的是,尽管有三个实体,但输出中只有一个C-tor,即...

c++ constructor semantics
1个回答
1
投票

所以为什么只显示一个C-tor?

© www.soinside.com 2019 - 2024. All rights reserved.