微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

很难理解对象生命周期、复制、移动构造函数

如何解决很难理解对象生命周期、复制、移动构造函数

我正在学习 C++ 并尝试了解移动构造函数和复制构造函数的对象生命周期。我在 vscode 中使用 g++ 9.2.0、c++17。 当我为纸牌游戏编写以下代码时,输​​出让我非常困惑......

#include <iostream>
#include <string>
#include <vector>
#include <utility>
#include <algorithm>

static const std::vector<std::string> Suits {"Club","Diamond","Heart","Spade" };
struct Card{
    std::string suit = "Blank";
    int value = 0;

    Card()                                          {puts("default constructed");} 
    Card(std::string s,int v): suit(s),value(v)   {std:: cout << this->suit << '\t';puts("card constructed");}
    Card(const Card& cc)                            {std:: cout << this->suit << '\t';puts("copy constructed:");} //copy constructor
    Card(Card && mc)                                {std:: cout << this->suit << '\t';puts("move constructed:");} //move constructor
    Card& operator= (const Card& cc)                {std:: cout << this->suit << '\t';puts("copy assign");  suit = cc.suit; value = cc.value; return *this;} //copy assignment
    Card& operator= (Card&& mc)                     {std:: cout << this->suit << '\t';puts("move assign");  suit = std::move(mc.suit);  value = std::move(mc.value); return *this;}  //move assignment
    ~Card()                                         {std:: cout << this->suit << '\t';puts("card destroyed");}
};


struct Deck{
    std::vector<Card> cards;
    int num_remain{0} ;

    Deck(): cards(std::vector<Card>{}),num_remain(0){puts("Deck constructed");}    
    ~Deck()                                         {puts("Deck destroyed");}
    
    void build_deck(); 
};

void Deck::build_deck(){

    puts("start builing----------------------");
    cards.clear();
    num_remain = 0;
   

        for (auto s : Suits){
            for (int v = 1; v <= 3; ++v){ 
                cards.emplace_back(s,v);  
                num_remain++;
                std::cout << num_remain << '\n';
                puts("==========Card Added===============");
            }
        }
        

    puts("finish building-----------------------");
    return;
}


int main(){
    
    Deck draw; 
    Deck discard; 
    puts("~~~two deck created~~~"); 
    draw.build_deck();
    return 0;
}

终端输出

Deck constructed
Deck constructed
~~~two deck created~~~
start builing----------------------
Club    card constructed
1
==========Card Added===============
Club    card constructed
Blank   copy constructed:
Club    card destroyed
2
==========Card Added===============
Club    card constructed
Blank   copy constructed:
Blank   copy constructed:
Blank   card destroyed
Club    card destroyed
3
==========Card Added===============
Diamond card constructed
4
==========Card Added===============
Diamond card constructed
Blank   copy constructed:
Blank   copy constructed:
Blank   copy constructed:
Blank   copy constructed:
Blank   card destroyed
Blank   card destroyed
Club    card destroyed
Diamond card destroyed
5
==========Card Added===============
Diamond card constructed
6
==========Card Added===============
Heart   card constructed
7
==========Card Added===============
Heart   card constructed
8
==========Card Added===============
Heart   card constructed
Blank   copy constructed:
Blank   copy constructed:
Blank   copy constructed:
Blank   copy constructed:
Blank   copy constructed:
Blank   copy constructed:
Blank   copy constructed:
Blank   copy constructed:
Blank   card destroyed
Blank   card destroyed
Blank   card destroyed
Blank   card destroyed
Diamond card destroyed
Diamond card destroyed
Heart   card destroyed
Heart   card destroyed
9
==========Card Added===============
Spade   card constructed
10
==========Card Added===============
Spade   card constructed
11
==========Card Added===============
Spade   card constructed
12
==========Card Added===============
finish building-----------------------      
Deck destroyed
Deck destroyed
Blank   card destroyed
Blank   card destroyed
Blank   card destroyed
Blank   card destroyed
Blank   card destroyed
Blank   card destroyed
Blank   card destroyed
Blank   card destroyed
Heart   card destroyed
Spade   card destroyed
Spade   card destroyed
Spade   card destroyed

谁能解释为什么不同循环之间存在不一致?

我之前使用过 push_back,它似乎比使用 emplace_back 像这里的代码那样构造更多的空白卡副本。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。