zoukankan      html  css  js  c++  java
  • 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;
    }
    输出为:



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

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

    (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();
    }
    
    结果为:

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


    那么,假设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笔试做这道题的时候。析构的顺序似乎弄错了。郁闷。

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

    继续努力吧。

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




  • 相关阅读:
    找细胞(题解)
    关于dfs
    奇怪的电梯(题解)
    信息解码(Message Decoding ACM/ICPC 1991)
    查找最大元素
    8皇后问题(dfs)
    如何利用dfs遍历树
    dfs(计算细胞数量)
    决策树减支问题(优化)dfs减支问题
    组合数问题
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7276819.html
Copyright © 2011-2022 走看看