zoukankan      html  css  js  c++  java
  • 构造函数、成员变量顺序

      最近看到这样一道笔试题,偶学习整理了一下,不到之处,希望各位指正。
      问题: 下列程序的输出是什么?


    #include <iostream>
    using namespace std;

    class A {
    public:
      A() {cout << "A" << endl;}
      ~A() {cout << "~A" << endl;}
    };

    class B {
    public:
      B() {cout << "B" << endl;}
      ~B() {cout << "~B" << endl;}
    private:
      A a;
    };

    class C: public A {
    public:
      C() {cout << "C" << endl;}
      ~C() {cout << "~C" << endl;}
    private:
      B b;
    public:
      A a;
    };

    int main() {
      C *p = new C();
      delete p;
      return 0;
    }        正确答案是:


             下面是我的分析:
            把握几个原则:
    1)父类首先被初始化,初始化顺序与继承顺序相同。这里C继承A,所以要先初始化其父类A。
    2)对象初始化时, 类成员变量的空间分配和初始化是在调用构造函数之前,无论是public的还是private的。
    3)类成员变量的初始化顺序是由它们的声明顺序决定的,无论是public还是private的。
    4)对象析构时,变量释放和析构函数的调用与初始化相反。
            所以上面的打印结果分析如下:
    A -- 父类class A 的构造函数打印出来
    A -- 初始化class C的成员变量B b,B继承A,所以再次调用A的构造函数打印
    B -- class C的成员变量调用自己的构造函数打印
    A -- 初始化class C的成员变量A a,A的构造函数打印
    C --  最后才是C自己的构造函数打印
            析构过程与上述顺序相反。

    大部分转载 小部分自写
  • 相关阅读:
    判断集合关系(自反,反自反,对称,反对称,传递)
    LINUX查看系统日志
    恶意代码分析——静态分析高级技术
    恶意代码分析——动、静态分析基础技术
    链表实现多项式相加和相乘
    一个完整顺序表的实现
    数据结构顺序表删除所有特定元素x
    数据结构-顺序表插入元素时扩容问题
    apscheduler定时器
    tkinter Scale滑块
  • 原文地址:https://www.cnblogs.com/8586/p/1509503.html
Copyright © 2011-2022 走看看