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自己的构造函数打印
            析构过程与上述顺序相反。

    大部分转载 小部分自写
  • 相关阅读:
    try和catch
    获取地址栏参数(E积分项目)
    正则验证,只能输入数字,每四位隔一个空格。
    E积分项目总结(绑卡页 第一步)
    本地存储localStorage用法详解
    python os 模块介绍
    生成器迭代器
    python 魔法方法
    匿名函数
    python自定义函数和内置函数
  • 原文地址:https://www.cnblogs.com/8586/p/1509503.html
Copyright © 2011-2022 走看看