zoukankan      html  css  js  c++  java
  • 一段程序的分析——C++析构器,何时析构

    最近在看小甲鱼的视频,有段程序是这么写的:

     1 #include <iostream>
     2 #include <string>
     3 
     4 class Pet
     5 {
     6 public:
     7     Pet(std::string theName);
     8     ~Pet();
     9 
    10     static int getCount();
    11 
    12 protected:
    13     std::string name;
    14 
    15 private:
    16     static int count;
    17 };
    18 
    19 class Dog : public Pet
    20 {
    21 public:
    22     Dog(std::string theName);
    23 };
    24 
    25 class Cat : public Pet
    26 {
    27 public:
    28     Cat(std::string theName);
    29 };
    30 
    31 int Pet::count = 0;         // 注意这一句:他起码做了两件事
    32 
    33 Pet::Pet(std::string theName)
    34 {
    35     name = theName;
    36     count++;
    37 
    38     std::cout << "一只宠物出生了,名字叫做: " << name << "
    ";
    39 }
    40 
    41 Pet::~Pet()
    42 {
    43     count--;
    44     std::cout << name << "挂掉了
    ";
    45 }
    46 
    47 int Pet::getCount()
    48 {
    49     return count;
    50 }
    51 
    52 Dog::Dog(std::string theName) : Pet(theName)
    53 {
    54 }
    55 
    56 Cat::Cat(std::string theName) : Pet(theName)
    57 {
    58 }
    59 
    60 int main()
    61 {
    62     Dog dog("Tom");
    63     Cat cat("Jerry");
    64 
    65     std::cout << "
    已经诞生了" << Pet::getCount() << "只宠物!
    
    ";
    66 
    67     {
    68 
    69         Dog dog_2("Tom_2");
    70         Cat cat_2("Jerry_2");
    71 
    72         std::cout << "
    现在呢,已经诞生了" << Pet::getCount() << "只宠物!
    
    ";
    73 
    74     }
    75 
    76     std::cout << "
    现在还剩下 " << Pet::getCount() << " 只宠物!
    
    ";
    77 
    78     return 0;
    79 }

    我们现在要分析,析构器合适执行,那我们就重点观测,小动物是何时挂掉的~

    image

    image

    小结:
    我们发现,小动物是在main函数中,所有代码执行完之后挂掉的~~(其实就是走出大括号,他们的生命就结束了,析构器执行了)
    我们还发现,后诞生的小动物,会首先被送走(析构)。(真是“白毛”送“黑毛”啊,呜呜~~)

    image

    image

    加上括号之后,jerry_2和Tom_2,在执行“现在还剩。。。”这句之前就挂掉了!
    原因在于,jerry_2和Tom_2被“圈养”在一个大括号之内了,那么这个大括号以内就是他们人生的全部了。程序顺序执行,
    一旦走出这个“圈圈”,jerry_2和Tom_2就被析构了~~!!


    总结:对象何时被析构,就看程序何时走(执行)出,属于对象的“圈”(大括号)。

  • 相关阅读:
    Spring Boot中使用logback日志框架
    Java日志框架-logback配置文件参考(转)
    Java日志框架-logback配置文件多环境日志配置(开发、测试、生产)(原始解决方法)
    MySQL取每组的前N条记录
    跟大佬一起读源码:CurrentHashMap的扩容机制
    源码速读及点睛:HashMap
    求两个Linux文本文件的交集、差集、并集
    哪个先执行:@PostConstruct和@Bean的initMethod?
    Android Studio3.0 Error:Execution failed for task ':app:javaPreCompileDebug' 错误
    Android原生项目集成React Native
  • 原文地址:https://www.cnblogs.com/douzi2/p/3839642.html
Copyright © 2011-2022 走看看