首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >c++学习笔记4,调用派生类的顺序构造和析构函数(一个)

c++学习笔记4,调用派生类的顺序构造和析构函数(一个)

作者头像
全栈程序员站长
发布2022-07-05 19:41:12
发布2022-07-05 19:41:12
97000
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是全栈君

测试源代码:

代码语言:javascript
代码运行次数:0
运行
复制
//測试派生类的构造函数的调用顺序何时调用
//Fedora20 gcc version=4.8.2
#include <iostream>
using namespace std;

class base
{
public:
	base()
	{
		
		cout<<"base created!"<<endl;
	}
	~base()
	{
		cout<<"base destroyed!"<<endl;
	}
};
//公有继承
class A:public base
{
public:
	A()
	{
		cout<<"A created!"<<endl;
	}
	~A()
	{
		cout<<"A destroyed!"<<endl;
	}
};
class B:public A
{
public:
	B()
	{
		cout<<"B created!"<<endl;
	}
	~B()
	{
		cout<<"B destroyed!"<<endl;
	}
};

測试代码:

代码语言:javascript
代码运行次数:0
运行
复制
int main()
{
	A a;
	<span style="color:#ff0000;">A *a1;</span>
	cout<<"能够看到a1并没有调用基类的构造函数"<<endl;
	<span style="color:#ff0000;">A *a2=new A;</span>
	//仅仅有在new 一个对象的时候才会调用基类的构造函数
	cout<<"能够看到a3也并没有调用基类的构造函数"<<endl;
	A *a3=&a;
代码语言:javascript
代码运行次数:0
运行
复制
       B b;
}

输出为:

能够看到,在创建派生类的对象的时候,首先调用的是基类中的构造函数,然后才是调用派生类自己的构造函数。

而在析构的时候,顺序则刚好相反,先调用派生类的析构函数,然后才是调用基类的构造函数。这是由于对象创建时候对象存放在堆栈中的原因。(new 的对象尽管是存在堆中,可是在堆栈中依旧存放其堆中的地址,因此。析构的时候也是一样)

那么,创建其对象的数组时:A a[2],是否会调用其构造函数呢。这是肯定的。例如以下

測试代码:(仅改动main里面的内容)

代码语言:javascript
代码运行次数:0
运行
复制
int main()
{
	 A a[2];
}

结果为:

那假设是创建指向其对象的数组呢? A *a[2];

代码语言:javascript
代码运行次数:0
运行
复制
int main()
{
	 A *a[2];
}

答案显然是不会。

那么这个时候,假设A里面有一个函数fun(),令a[0]->fun()会发生什么情况呢?

代码语言:javascript
代码运行次数:0
运行
复制
void fun()
	{
		cout<<"A fun run"<<endl;
	}

測试代码:

代码语言:javascript
代码运行次数:0
运行
复制
int main()
{
	 A *a[2];
	a[0]->fun();
}

结果为:

能够看到,尽管没有调用构造函数,可是依旧能够使其运行其成员函数呢!

那么,假设A有一个public int i;的变量,a[0]->i,会是什么?

代码语言:javascript
代码运行次数:0
运行
复制
class A:public base
{
public:
	int i;
	A()
	{
		cout<<"A created!"<<endl;
	}
	~A()
	{
		cout<<"A destroyed!"<<endl;
	}
	void fun()
	{
		cout<<"A fun run"<<endl;
	}
};

測试代码:

代码语言:javascript
代码运行次数:0
运行
复制
int main()
{
	 A *a[2];
	a[0]->fun();
	cout<<endl<<a[0]->i<<endl;
}

结果:

能够看到,a[0]->i指向一个不确定的值。假设指定static const int i=1;那么,指向的必定就是1了。

今天就先測试这些最简单的吧,有点累了。多继承。虚基层明天再測试。

突然发现好像上次UC笔试做这道题的时候。析构的顺序似乎弄错了,郁闷。

还没收到面试信息。也还没有受到笔试挂了的通知,也不知道是个什么情况啊。

保持。

有时,细节很重要!

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/117722.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年1月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档