C++中构造函数、析构函数以及类成员初始化顺序详解
来源:互联网 发布:linux shell脚本减法 编辑:程序博客网 时间:2024/06/11 21:13
实验代码:
#include <iostream>
#include <stdlib.h>
using namespace std;
class base
{
public:
virtual void get()=0;
int a;
base(inti)
{
a = i;
cout<<"base:"<<i<<endl;
}
~base()
{
cout<<"baseis destroyed : "<<a<<endl;
getchar();
}
};
class base1:publicbase
{
public:
int a;
void get()
{
}
base1(inti):base(i)
{
cout<<"base1:"<<i<<endl;
a = i;
}
~base1()
{
cout<<"base1is destroyed : "<<a<<endl;
}
};
class base2:publicbase1
{
public:
void get()
{
}
base2(inti,int j = 0):mem(4),mem2(5),base1(3)
{
cout<<"base2:"<<i<<endl;
}
~base2()
{
cout<<"base2is destroyed"<<endl;
}
base1 mem;
base1 mem2;
};
int main()
{
base2 b(1);
return 0;
}
结果:
不必理会行…… 只是为了让程序不至于被关闭才出的下策
结论:
1、首先不管父类是不是虚函数,它的构造函数和析构函数都是会被调用的。
2、基类先调用父类的构造函数,再初始化类成员对象,最后才会调用基类的构造函数。(所以base2(int i,int j = 0):mem(4),mem2(5),base1(3)中的base1(3)不管放在最前面或者最后面都会先被调用)
2、构造函数的调用顺序是,从父类开始,先调用父类的构造函数,然后一层一层往外直到基类。
3、析构函数的调用顺序是,由基类向父类一层一层往里调用。
4、最后还有两点要注意:
1) 在基类中析构函数的调用优先于基类中成员对象的销毁之后会销毁基类的成员对象。(这个很好理解,因为析构函数的作用是打扫战场,如果类成员中有使用new方法创建的对象,就必须在析构函数中去将类成员delete掉,如果类成员先于析构函数被销毁,那析构函数中的delete语句不就一点用都没有了嘛)
2) 成员对象销毁之后才会调用父类的析构函数,一层一层往里调用。(实际上就是基类完全被释放之后才会释放父类)
- C++中构造函数、析构函数以及类成员初始化顺序详解
- [C++]类成员冒号初始化以及构造函数内赋值
- java 构造函数 成员函数初始化顺序 以及多态的构造函数的调用顺序
- java 构造函数 成员函数初始化顺序 以及多态的构造函数的调用顺序
- c++构造函数以及类中变量初始化顺序
- 基类派生类构造析构函数调用顺序、成员初始化和销毁顺序
- 关于类继承/初始化成员变量/构造函数/析构函数 执行顺序
- 关于类继承/初始化成员变量/构造函数/析构函数 执行顺序
- 关于类继承/初始化成员变量/构造函数/析构函数 执行顺序
- 构造函数及其成员变量初始化顺序详解
- C++构造函数中成员对象的初始化顺序
- C++中构造函数,成员对象的初始化顺序
- 构造函数中成员变量初始化顺序问题
- C++构造函数中初始化成员的先后顺序
- 构造函数中初始化成员
- C++类对象数据成员的构造函数初始化顺序
- C++中类的构造函数与析构函数(成员初始化列表)
- C++类成员冒号初始化以及构造函数内赋值
- 事件监听,内部类
- 内部类和嵌套类
- 安卓调用系统的图库选择图片并获取Uri路径
- linux基础知识之:Shell编程
- 【SICP练习】125 练习3.56
- C++中构造函数、析构函数以及类成员初始化顺序详解
- Variance
- mybatis:"configuration" must match "(properties?,settings?,typeAliase.....
- 腾讯笔试题精选一
- chmod
- UVa1644 - Prime Gap
- (产品技术)Axure7.0圆角矩形
- android一个BaseAdapter的使用(LayoutInflater加载自定义布局)
- xcode6.2 新建分类方法