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

測试源代码:

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

输出为:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE4NDQzNTIxNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

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

而在析构的时候。顺序则刚好相反。先调用派生类的析构函数,然后才是调用基类的构造函数,这是由于对象创建时候对象存放在堆栈中的原因。

(new 的对象尽管是存在堆中,可是在堆栈中依旧存放其堆中的地址,因此,析构的时候也是一样)

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

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

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

结果为:

那假设是创建指向其对象的数组呢? 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();
}

结果为:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE4NDQzNTIxNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

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

那么,假设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;
}

结果:

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

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

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

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

继续努力吧。

有时候。细节真的非常重要!

时间: 2024-12-13 15:48:44

c++学习笔记4,派生类的构造函数与析构函数的调用顺序(一)的相关文章

c++学习笔记5,多重继承中派生类的构造函数与析构函数的调用顺序(二)

现在来测试一下在多重继承,虚继承,MI继承中虚继承中构造函数的调用情况. 先来测试一些普通的多重继承.其实这个是显而易见的. 测试代码: //测试多重继承中派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace std; class base { public: base() { cout<<"base created!"<<endl; }

C++:派生类的构造函数和析构函数的调用顺序

一.派生类 在C++编程中,我们在编写一个基类的派生类时,大致可以分为四步: ? 吸收基类的成员:不论是数据成员还是函数成员,派生类吸收除基类的构造函数和析构函数之外的全部成员. ? 改造基类函数:在派生类中声明一个或多个与其(某个)基类中的成员函数同名的成员函数,并将它(们)根据新的需求进行重写 ? 发展新的成员:在派生类中添加新的成员变量和成员函数,其中新添加的成员要求必须和基类中的成员不同名,并且应当保证新添加的成员会使派生类在功能上相比其基类有所发展 ? 重写派生类的构造函数和析构函数

派生类的构造函数与析构函数的调用顺序

派生类构造函数各部分的执行次序为1.调用基类的构造函数,按他们在派生类定义的先后顺序,顺序调用.2.调用成员对象的构造函数,按他们在类定义中声明的先后顺序,顺序调用3.派生类的构造函数体中的操作 在派生类构造函数中,只要基类不是使用缺省构造函数,都要显式给出基类名和参数表如果基类没有定义构造函数,则派生类也可以不定义,全部采用系统给定的缺省构造函数.如果基类定义了带有形参表的构造函数时,派生类就应当定义构造函数. //Test1.h #include<iostream> using names

C++基类和派生类的构造函数和析构函数的调用

C++基类和派生类的构造函数和析构函数的调用 1.调用顺序 当创建一个派生类的对象时,系统首先自动创建一个基类对象,也就是说,在调用派生类构造函数创建派生类对象之前,系统首先调用基类的构造函数创建基类对象.当派生类对象生命期结束时,首先调用派生类的析构函数,然后调用基类的析构函数. 所以,构造函数:基类->派生类:析构函数:派生类->基类. 示例: 1 #include<iostream> 2 using namespace std; 3 4 class A 5 { 6 publi

类的构造函数与析构函数的调用顺序

先来段代码: 1 #include <iostream> 2 using namespace std; 3 4 class Clock{ 5 private: 6 int H,M,S; 7 public: 8 Clock(int h=0,int m=0,int s=0){ 9 H=h,M=m,S=s; 10 cout<<"constructor:"<<H<<":"<<M<<":&quo

C++:派生类的构造函数和析构函数

4.2 派生类的构造函数和析构函数4.2.1 派生类构造函数和析构函数的执行顺序 通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数:当撤销派生类对象时,则先执行派生类的派生类的析构函数,随后再执行基类的析构函数. //例4.5 派生类的构造函数和析构函的执行顺序 #include<iostream> using namespace std; class Base{ //声明基类Base public: Base() { cout<<"Co

对C++中派生类的构造函数和析构函数的认识

一:构造函数 形式:派生类名::派生类名:基类名1(参数1),基类名2(参数2),--基类名n(参数n),数据成员1(参数1),数据成员2(参数2),--数据成员n(参数n){ 各种操作的说明 } 执行过程:先执行基类的构造函数,再进行数据成员的赋值,最后执行函数体. 其中基类名和数据成员的顺序是由在派生类的定义中声明的顺序决定执行的顺序的,因此它们的顺序是任意的,但为了可读性,还是最好按顺序写. 如果基类只有默认构造函数,则基类名和参数表可以不用写出来. 二:复制构造函数 派生类的构造函数的形

C++C++中构造函数与析构函数的调用顺序

http://blog.csdn.net/xw13106209/article/details/6899370 1.参考文献 参考1: C++继承中构造函数.析构函数调用顺序及虚函数的动态绑定 参考2: 构造函数.拷贝构造函数和析构函数的的调用时刻及调用顺序 参考3: C++构造函数与析构函数的调用顺序 2.构造函数.析构函数与拷贝构造函数介绍 2.1构造函数 构造函数不能有返回值 缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空 创建一个对象

【C/C++】构造函数与析构函数的调用顺序

常见问题 Q1. 以下代码的输出结果是什么? 1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 A() { cout << "A" << endl; } 8 ~A() { cout << "~A" << endl; } 9 }; 10 class B : public A 11 { 12 public: 13 B