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

2014-11-24 13:06:08 · 作者: · 浏览: 1

测试源码

//测试派生类的构造函数的调用顺序何时调用
//Fedora20 gcc version=4.8.2
#include 
  
   
using namespace std;

class base
{
public:
	base()
	{
		
		cout<<"base created!"<
   
    
测试代码:

int main()
{
	A a;
	A *a1;
	cout<<"可以看到a1并没有调用基类的构造函数"<
     
      
       B b;
}
输出为:

\


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

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


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

测试代码:(仅修改main里面的内容)

int main()
{
	 A a[2];
}
结果为:

\

< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+xMfI57n7yse0tL2o1rjP8sbkttTP87XEyv3X6cTYPyBBICphWzJdOzwvcD4KPHByZSBjbGFzcz0="brush:java;">int main() { A *a[2]; }

答案显然是不会。

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

void fun()
	{
		cout<<"A fun run"<
     
      测试代码:

      

int main()
{
	 A *a[2];
	a[0]->fun();
}
结果为: \

可以看到,虽然没有调用构造函数,但是依然可以使其执行其成员函数呢!


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

class A:public base
{
public:
	int i;
	A()
	{
		cout<<"A created!"<
       
        
测试代码:

int main()
{
	 A *a[2];
	a[0]->fun();
	cout<
         
          i<
          
           
结果:



可以看到,a[0]->i指向一个不确定的值!如果指定static const int i=1;那么,指向的必然就是1了。

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

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

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

继续努力吧。

有时候,细节真的很重要!