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

    大部分转载 小部分自写
  • 相关阅读:
    软件测试—— junit 单元测试
    falut error failure 的区别与理解
    错误的反思
    只能在微信浏览器打开的链接,如何查看源码
    PHPManage for IIS Windows 10
    wamp mysql配置
    CSS Flexbox 学习指南、工具与框架
    Android SDK 在线更新镜像服务器资源
    64位win2003 IIS6运行32位的.NET程序
    让服务器iis支持.apk文件下载的设置方法
  • 原文地址:https://www.cnblogs.com/8586/p/1509503.html
Copyright © 2011-2022 走看看