zoukankan      html  css  js  c++  java
  • 【c++】一道关于继承和析构的笔试题

    题目如下,求输出结果

        class A 
        { 
        public: 
            A()  {    cout<<"A"<<endl;    } 
            ~A() {    cout<<"~A"<<endl;   } 
        }; 
         
        class B:public A 
        { 
        public: 
            B(A &a):_a(a) 
            { 
                cout<<"B"<<endl; 
            } 
            ~B() 
            { 
                cout<<"~B"<<endl; 
            } 
        private: 
            A _a; 
        }; 
         
        int main(void) 
        { 
            A a;
            B b(a);
            return 0;
        } 

    这里先给出答案:

    [root]$ ./class
    A
    A
    B
    ~B
    ~A
    ~A
    ~A

    你可能会觉得奇怪,为什么少调了一次A的构造函数。其实这是由于使用初始化列表,初始化列表在初始化类的对象的时候,使用的是拷贝构造函数。

    修改代码,增加拷贝构造函数的打印。

        class A 
        { 
        public: 
            A()  {    cout<<"A"<<endl;    } 
            ~A() {    cout<<"~A"<<endl;   } 
            A(const A& a) {cout << "copy" << endl;}
        }; 
         
        class B:public A 
        { 
        public: 
            B(A &a):_a(a) 
            { 
                cout<<"B"<<endl; 
            } 
            ~B() 
            { 
                cout<<"~B"<<endl; 
            } 
        private: 
            A _a; 
        }; 
         
        int main(void) 
        { 
            A a;
            B b(a);
            return 0;
        }   

    再看运行结果,这样构造和析构的次数就一致了。

    [root]$ ./class
    A
    A
    copy
    B
    ~B
    ~A
    ~A
    ~A
  • 相关阅读:
    goland 安装包激活码
    go目录文件
    php 单表数据转化为json格式
    thinkphp分页查询,后台处理怎么做
    用js 获取url 参数 页面跳转 ? 后的参数
    约瑟夫问题
    openstack配置
    Python数据结构
    Python常用排序算法
    scrapy使用
  • 原文地址:https://www.cnblogs.com/seyjs/p/5237944.html
Copyright © 2011-2022 走看看