暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

C++高级编程(第4版) 个人笔记 - 关于构造和析构

东拉西扯 2020-04-18
203


参考书籍: 《C++高级编程》(第4版)》


1.Composition(组合)关系下的构造和析构:

构造由内而外:

Container的构造函数首先调用Componentdefault构造函数,然后才执行自己。

    Container::Container(...):Compnent() {...};

    析构由外而内:

    Container的析构函数首先执行自己,然后才调用Compnent的析构函数。

      ~Container::Container(...){~Component()};

      测试:

      Container:

        //Container.h


        #ifndef GOUZHAOXIGOU_CONTAINER_H
        #define GOUZHAOXIGOU_CONTAINER_H


        #include <iostream>
        #include "Component.h"


        class Container {
        public:
        Container(){
        std::cout << "Container构造" << std::endl;
        }
        ~Container(){
        std::cout << "Container析构" << std::endl;
        }

        private:
        Component m_component;
        };


        #endif //GOUZHAOXIGOU_CONTAINER_H

        Component:

          //Component.h


          #ifndef GOUZHAOXIGOU_COMPONENT_H
          #define GOUZHAOXIGOU_COMPONENT_H


          #include <iostream>


          class Component {
          public:
          Component(){
          std::cout << "Component构造" << std::endl;
          }
          ~Component(){
          std::cout << "Component析构" << std::endl;
          }


          };


          #endif //GOUZHAOXIGOU_COMPONENT_H

          main:

            #include "Container.h"


            int main() {
            Container container;
            return 0;
            }

            测试结果:

            2.Inheritance(继承)关系下的构造和析构:

            base classdtor 必须是 virtual,否则会出现 undefined behavior

            构造由内而外:

            Derived的构造函数首先调用Basedefault构造函数,然后才执行自己。

              Derived::Derived(...):Base(){...};

              析构由外而内:

              Derived 的析构函数首先执行自己,然后才调用 Base 的析构函数。

                Derived::~Derived(...){...~Base()};

                测试:

                Base:

                  //Base.h


                  #ifndef GOUZHAOXIGOU_BASE_H
                  #define GOUZHAOXIGOU_BASE_H


                  #include <iostream>


                  class Base {
                  public:
                  Base(){
                  std::cout << "Base构造" << std::endl;
                  }
                  ~Base(){
                  std::cout << "Base析构" << std::endl;
                  }
                  };


                  #endif //GOUZHAOXIGOU_BASE_H

                  Derived:

                    //Derived.h


                    #ifndef GOUZHAOXIGOU_DERIVED_H
                    #define GOUZHAOXIGOU_DERIVED_H


                    #include "Base.h"


                    class Derived : public Base{
                    public:
                    Derived(){
                    std::cout << "Derived构造" << std::endl;
                    }
                    ~Derived(){
                    std::cout << "Derived析构" << std::endl;
                    }
                    };


                    #endif //GOUZHAOXIGOU_DERIVED_H

                    main:

                      #include "Derived.h"


                      int main() {
                      Derived derived;
                      return 0;
                      }

                      测试结果:

                      3.Inheritance+Composition(继承+组合)关系下的构造和析构:

                      构造由内而外:

                      Derived的构造函数首先调用Basedefault构造函数,然后调用Componentdefault构造函数,然后才执行自己。

                        Derived::Derived(...):Base(){...};

                        析构由外而内:

                        Derived的析构函数首先执行自己,然后调用Component的析构函数,然后才调用Base的析构函数。

                          Derived::~Derived(...)){...~Component(), ~Base()};

                          测试:

                          修改Derived:

                            //Derived.h


                            #ifndef GOUZHAOXIGOU_DERIVED_H
                            #define GOUZHAOXIGOU_DERIVED_H


                            #include "Base.h"
                            #include "Component.h"


                            class Derived : public Base{
                            public:
                            Derived(){
                            std::cout << "Derived构造" << std::endl;
                            }
                            ~Derived(){
                            std::cout << "Derived析构" << std::endl;
                            }


                            private:
                            Component component;
                            };


                            #endif //GOUZHAOXIGOU_DERIVED_H

                            测试结果:


                            欢迎关注公众号:c_302888524 发送:"C++高级编程(第3版)" 获取电子书

                            文章转载自东拉西扯,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                            评论