博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
父类、构造函数、成员对象的调用时机
阅读量:4071 次
发布时间:2019-05-25

本文共 1346 字,大约阅读时间需要 4 分钟。

在使用new创建对象时,主要完成四项工作:
1 构造父类成员对象
2 构造子类成员对象
3 调用父类构造函数
4 调用子类构造函数
这四项工作的时间顺序是怎样的呢?
原则是:
先父类后子类,先成员后函数
一级继承
例如:
class X{
    public:
        X(){cout<<"X";}
};
class A{
    public:
         X x1;
         A(){cout<<"A";}
};
class B: public A{
    public:
        X x2;
        B(){cout<<"B";}
};
int main(){
    B b;
}
构造对象B时,根据第1个原则:先父类后子类,先构造A(1),然后构造B(2)。
构造A(1):
 然后根据第2个原则,先成员后函数,先构造A的成员x1,即先调用X构造函数,然后再调用A构造函数
构造B(2):
 根据第2个原则,先成员后函数,先构造B的成员x2,即先调用X构造函数,然后再调用B构造函数
因此输出为:
XAXB
多级继承
在一级继承中这个比较容易分析,在多级继承中就会复杂些,但坚持这两个原则,细心分析也不会出问题的。
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
class X{
    public:
        X(){cout<<"X";}
};
class Y{
    public:
        Y(){cout<<"Y";}
};
class A{
    public:
        A(){cout<<"A";}
        ~A(){cout<<"~A";}
};
class B: public A{
    public:
        Y x;
        A a;
        Y y;
        B(){cout<<"B";}
        ~B(){cout<<"~B";}
};
class C: public B{
    protected:
        X x;
        B b;
        A a;
        X y;
    public:
        C(){cout<<"C";}
        ~C(){cout<<"~C";}
};
int main(){
    C *c = new C();
    delete c;
}
这个程序的输出就比较复杂:
AYAYBXAYAYBAXC~C~A~B~A~A~B~A~A
开始分析:
先父类后子类,所以先构造B(1),然后构造C(2)
构造B(1)的过程如下:
也是先构造A(1.1),然后构造B(1.2)
构造A(1.1)的过程如下:
调用A的构造函数,输出A(第一个输出字符)
构造B(1.2)的过程如下:
先成员(1.2.1)后构造(1.2.2),
成员(1.2.1)的过程如下:
B的成员有Y,A,Y,所以构造Y,A,Y,输出YAY(第二到四个字符)
构造(1.2.2)的过程如下:
B的构造函数,输出B(第五个字符)
所以构造B一共会输出YAYB四个字符
构造C(2)的过程如下:
先成员(2.1)后构造(2.2)
成员(2.1)的过程如下:
C的成员有XBAX
所以构造X,输出X(第六个字符)
构造B输出AYAYB(第七到十一个字符)
构造A输出A(第十二个字符)
构造X输出X(第十三个字符)
构造(2.2)
输出C(第十四个字符)
最后按照完全相反的顺序调用析构函数

转载地址:http://agmji.baihongyu.com/

你可能感兴趣的文章
Homebrew指令集
查看>>
React Native(一):搭建开发环境、出Hello World
查看>>
React Native(二):属性、状态
查看>>
JSX使用总结
查看>>
React Native(四):布局(使用Flexbox)
查看>>
React Native(七):Android双击Back键退出应用
查看>>
Android自定义apk名称、版本号自增
查看>>
adb command not found
查看>>
Xcode 启动页面禁用和显示
查看>>
【剑指offer】q50:树中结点的最近祖先
查看>>
二叉树的非递归遍历
查看>>
【leetcode】Reorder List (python)
查看>>
【leetcode】Linked List Cycle (python)
查看>>
【leetcode】Candy(python)
查看>>
【leetcode】Sum Root to leaf Numbers
查看>>
【leetcode】Pascal's Triangle II (python)
查看>>
java自定义容器排序的两种方法
查看>>
如何成为编程高手
查看>>
本科生的编程水平到底有多高
查看>>
备忘:java中的递归
查看>>