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

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

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

测试源代码:

//測试派生类的构造函数的调用顺序何时调用
//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;
	}
};

測试代码:

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;
       B b;
}

输出为:

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

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

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


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

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

int main()
{
	 A a[2];
}

结果为:

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

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

int main()
{
	 A *a[2];
}

答案显然是不会。

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

void fun()
	{
		cout<<"A fun run"<<endl;
	}

測试代码:

int main()
{
	 A *a[2];
	a[0]->fun();
}

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

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


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

class A:public base
{
public:
	int i;
	A()
	{
		cout<<"A created!"<<endl;
	}
	~A()
	{
		cout<<"A destroyed!"<<endl;
	}
	void fun()
	{
		cout<<"A fun run"<<endl;
	}
};

測试代码:

int main()
{
	 A *a[2];
	a[0]->fun();
	cout<<endl<<a[0]->i<<endl;
}

结果:

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

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

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

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

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

保持。

有时,细节很重要!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Axis2创建WebService实例(转载)

    Axis2创建WebService实例(转载)博文地址:http://clq9761.iteye.com/blog/976029

    2022年7月21日
    14
  • Oracle创建用户和授权

    Oracle创建用户和授权Oracle创建用户和授权一、安装后修改管理员密码并登陆运行cmd命令行录入sqlplus/nolog无用户名登录conn/assysdba连接到数据本地数据alterusersystemidentifiedbypassword;修改System的密码为password登陆system创建用户和授权其中的路径一定…

    2022年5月19日
    84
  • 前端开发博客_程序员的个人博客

    前端开发博客_程序员的个人博客国内技术团队博客,大多集中在前端,下面是这些前端技术团队的博客。还有少量非前端(或者不只是前端)的技术博客,单独整理到另一个列表中去了(点击前往)【腾讯】腾讯前端Web团队IMWEBhttp://imweb.ioIMWEB团队创立之初是负责腾讯最核心的基础业务:QQ注册、QQ登录(ptlogin)、QQ资料和关系链拓展等基础服务。后转型进行应用开发,分别投入Q+、QQ圈

    2022年8月13日
    2
  • 频次最高的38道selenium面试题及答案(下)[通俗易懂]

    频次最高的38道selenium面试题及答案(下)[通俗易懂]20、selenium中隐藏元素定位,你该如何做?隐藏元素可以正常定位到,只是不能操作(定位元素和操作元素是两码事,操作元素是指click、clear、send_keys等这些方法)。我们可以用js来操作隐藏元素。js和selenium不同,只有页面上有的元素(在dom里面的)都能正常操作。21、如何判断一个页面上元素是否存在?法1:用try…except在代码块加上法2:用elements定义组元素方法然后根其元素个数len()<1存在返回True,不存在则返回F.

    2022年6月20日
    24
  • mybatis mysql 分页sql语句_使用mybatis分页查询并统计总数「建议收藏」

    mybatis mysql 分页sql语句_使用mybatis分页查询并统计总数「建议收藏」今天在优化项目的时候,偶尔发现了一种分页查询的方法。其目的是,在分页查询的同时查出数据总记录数并实现模糊查询功能。并且,在以往的分页查询上,如果要使用模糊查询,则模糊查询出来的总记录数可能出现问题。使用改方法可以优化代码。本项目使用的是springboot,mybatis,druid连接池以下贴上源码:mybatis的xml文件①resultMap=”trainResultMap,count”注…

    2022年6月2日
    213
  • java 静态变量 存储_Java中存储的静态方法和静态变量在哪里?「建议收藏」

    java 静态变量 存储_Java中存储的静态方法和静态变量在哪里?「建议收藏」静态方法(实际上所有方法)以及静态变量都存储在PermGen部分,因为它们是反射数据的一部分(类相关数据,而不是与实例相关的)。需要澄清的最新情况:注意,只有变量及其技术值(原语或引用)存储在PermGen空间中。如果静态变量是对象的引用,则该对象本身存储在堆的正常部分(年轻/旧代或幸存者空间)。这些对象(除非它们是类等内部对象)是不存储在PermGen空间。例子:staticinti=1…

    2022年5月2日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号