精华内容
下载资源
问答
  • c++构造函数调用顺序
    万次阅读 多人点赞
    2018-09-04 00:05:03

    1、构造函数的调用顺序 

    基类构造函数、对象成员构造函数、派生类本身的构造函数  

    2、析构函数的调用顺序

    派生类本身的析构函数、对象成员析构函数、基类析构函数(与构造顺序正好相反) 

    3、特例 

    局部对象,在退出程序块时析构

    静态对象,在定义所在文件结束时析构

    全局对象,在程序结束时析构 

    继承对象,先析构派生类,再析构父类 

    对象成员,先析构类对象,再析构对象成员

    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    class  Clock
    {
    public:
    	Clock()
    	{
    		cout << "clock的构造函数" << ",";
    	}
    	~Clock()
    	{
    		cout << "clock的析构函数" << ",";
    	}
    };
    
    class Date
    {
    public:
    	Date()
    	{
    		cout << "date的构造函数" << ",";
    	}
    	~Date()
    	{
    		cout << "date的析构函数" << ",";
    	}
    };
    
    
    void main()
    {
        Clock c;
    	Date d;
    	system("pause");
    }

    在使用构造函数和析构函数时,需要特别注意对它们的调用时间和调用顺序。在一般情况下,调用析构函数的次序正好与调用构造函数的次序相反:最先被调用的构造函数,其对应的(同一对象中的)析构函数最后被调用,而最后被调用的构造函数,其对应的析构函数最先被调用。
    可以简记为:先构造的后析构,后构造的先析构,它相当于一个栈,先进后出

    更多相关内容
  • C++构造函数调用顺序

    千次阅读 多人点赞 2019-06-24 09:49:26
    C++构造函数按下列顺序调用: (1)任何虚拟基类的构造函数按照它们被继承的顺序构造; (2)任何非虚拟基类的构造函数按照它们被继承的顺序构造; (3)任何成员对象的构造函数按照它们声明的顺序调用; (4)类自己...

    记忆原则,从“”出发,一层一层到要构造的类;
    析构函数则恰好相反
    C++构造函数按下列顺序被调用:
    (1)任何虚拟基类的构造函数按照它们被继承的顺序构造;
    (2)任何非虚拟基类的构造函数按照它们被继承的顺序构造;
    (3)任何成员对象的构造函数按照它们声明的顺序调用;
    (4)类自己的构造函数。

    #include <iostream>
    
    using namespace std;
    
    class OBJ1
    {
    public:
        OBJ1(){ cout <<"OBJ1\n"; }
    };
    
    class OBJ2
    {
    public:
        OBJ2(){ cout <<"OBJ2\n"; }
    };
    
    class Base1
    {
    public:
        Base1(){ cout <<"Base1\n"; }
    };
    
    class Base2
    {
    public:
        Base2(){ cout <<"Base2\n"; }
    };
    
    class Base3
    {
    public:
        Base3(){ cout <<"Base3\n"; }
    };
    
    class Base4
    {
    public:
        Base4(){ cout <<"Base4\n"; }
    };
    
    class Derived :public Base1, virtual public Base2,
        public Base3, virtual public Base4
    {
    public:
        Derived() :Base4(), Base3(), Base2(),
            Base1(), obj2(), obj1()
        {
            cout <<"Derived ok.\n";
        }
    protected:
        OBJ1 obj1;
        OBJ2 obj2;
    };
    
    int main()
    {
        Derived aa;
        cout <<"This is ok.\n";
    
        int i;
        cin >> i;
    
        return 0;
    }
    /*
    结果:
    Base2
    Base4
    Base1
    Base3
    OBJ1
    OBJ2
    Derived ok.
    This is ok.
    */
    
    展开全文
  • 构造函数的执行次序如下: ...1,调用基类构造函数调用顺序按照他们的继承时声明的顺序。 2,调用内嵌成员对象的构造函数调用顺序按照他们在类中声明的 顺序。 3,派生类的构造函数体中的内容。
  • c++构造函数调用顺序

    千次阅读 2020-12-16 17:59:39
    c++构造函数调用顺序 C++中调用构造函数按照如下顺序: 一:先调用虚拟基类的构造函数。并且按照它们的被继承的顺序进行构造。 二:调用非虚拟基类的构造函数,也是按照它们被继承的顺序构造。 三:调用类中成员...

    c++中构造函数的调用顺序

    C++中调用构造函数按照如下顺序:

    一:先调用虚拟基类的构造函数。并且按照它们的被继承的顺序进行构造。

    二:调用非虚拟基类的构造函数,也是按照它们被继承的顺序构造。

    三:调用类中成员对象的构造函数,按照声明顺序调用。

    四:最后调用自己的构造函数。

    举例:

    对于如下代码:

    #include <iostream>
    using namespace std;
    class B1 
    {
    public:   
        B1(int i) 
        {
            cout<<"B1 的构造函数被调用:"<<i<<endl;
        }	
    	~B1() 
        {
            cout<<"B1 的析构函数被调用。"<<endl;
        }	
    };
    
    class B2 
    {
    public: 
        B2(int j) 
        {
            cout<<"B2 的构造函数被调用:"<<j<<endl;
        }	
    	~B2() 
        {
            cout<<"B2 的析构函数被调用。"<<endl;
        }	
    };
    
    class C: public B2, public B1 
    {
    public:  
        C(int a, int b, int c, int d):B1(a),memberB2(d),memberB1(c),B2(b) 
        {
    		cout<<"C 的构造函数被调用。"<<endl;
    	}
    	~C()  
        { 
            cout<<"C 的析构函数被调用。"<<endl;
        }
    private:  
        B1 memberB1; 	B2 memberB2;
    };
    
    int main()
    {	
        C obj(1,2,3,4); 
    }
    

    可见在mian中的C这一派生类对象的定义,内部构造函数的顺序按以上规则:

    先按继承顺序构造基类构造函数,就是B2与B1,并且有参量分别为b、a,即2,1。

    接着是这个派生类内部的成员对象的构造函数,按照声明的顺序,即memberB1、memberB2。同时有参数c、d,即3、4。

    所以得到的输出结果如下:

    B2 的构造函数被调用:2
    B1 的构造函数被调用:1
    B1 的构造函数被调用:3
    B2 的构造函数被调用:4
    C 的构造函数被调用。
    C 的析构函数被调用。
    B2 的析构函数被调用。
    B1 的析构函数被调用。
    B1 的析构函数被调用。
    B2 的析构函数被调用。
    
    展开全文
  • 构造函数与析构函数及调用顺序构造函数定义特点析构函数定义特点构造函数与析构函数的执行顺序例题 构造函数 定义 构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据...

    构造函数

    定义

    构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。

    特点

    构造函数是特殊的成员函数,需要注意的是,构造函数的虽然名称叫构造,但是需要注意的是构造函数的主要任务并不是开空间创建对象,而是初始化对象。初始化只能初始化一次,而构造函数体内可以多次赋值。

    其特征如下:

    1. 函数名与类名相同。
    2. 无返回值。
    3. 对象实例化时编译器自动调用对应的构造函数。
    4. 构造函数可以重载。
    5. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。
    6. 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数。
    7. 而构造函数体内可以多次赋值。
    class Date
    {
    public:
     Date(int year, int month, int day)
     : _year(year)
     , _month(month)
     , _day(day)
     {}
    private:
     int _year;
     int _month;
     int _day;
    };
    

    关于构造函数,值得注意的是:
    1.每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
    2. 类中包含以下成员,必须放在初始化列表位置进行初始化:
    2.1 引用成员变量
    2.2 const成员变量
    2.3 自定义类型成员(该类没有默认构造函数)
    3. 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。
    4.成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。
    5.static 成员
    5.1概念:声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态的成员变量一定要在类外进行初始化。(重点!!!)
    5.2特点:
    5.2.1. 静态成员为所有类对象所共享,不属于某个具体的实例
    5.2.2. 静态成员变量必须在类外定义,定义时不添加static关键字
    5.2.3. 类静态成员即可用类名::静态成员或者对象.静态成员来访问
    5.2.4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
    5.2.5. 静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值

    析构函数

    定义

    **析构函数:**与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。

    特点

    析构函数是特殊的成员函数。
    其特征如下:

    1. 析构函数名是在类名前加上字符 ~。
    2. 无参数无返回值。
    3. 一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。
    4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。
    5. 编译器自动生成的默认析构函数,对会自定类型成员调用它的析构函数。

    构造函数与析构函数的执行顺序

    1. 构造顺序是按照语句的顺序进行构造,析构是按照构造的相反顺序进行析构。
    2. 对象析构要在生存作用域结束的时候才进行析构。
    3. 类的析构函数调用完全按照构造函数调用的相反顺序进行调用。
    4. 全局对象先于局部对象进行构造。
    5. 静态对象先于普通对象进行构造。

    例题

    设已经有A,B,C,D4个类的定义,程序中A,B,C,D析构函数调用顺序为?( )

    C c;
    int main()
    {
    	A a;
    	B b;
    	static D d;
    	
    	return 0;
    }
    

    根据上述所给概念,构造函数的执行顺序应为:C D A B
    析构函数执行顺序则应为:B A D C

    展开全文
  • C++ 语言一直被批评太复杂了,很多细节的地方需要仔细推敲,甚至其构造函数和析构的调用顺序也成为了一个让人迷惑的问题,在此我做了简单的总结。这篇文章主要介绍了C++构造函数与析构函数的调用顺序,需要的朋友...
  •  先看看构造函数调用顺序规则,只要我们在平时编程的时候遵守这种约定,任何关于构造函数的调用问题都能解决;构造函数调用顺序总是如下:  1.基类构造函数。如果有多个基类,则构造函数调用顺序是某类在...
  • 继承构造函数调用顺序 C ++中带有继承的构造函数调用的顺序 (Order of Constructor Call with Inheritance in C++) Base class constructors are always called in the derived class constructors. Whenever you ...
  • 可见性继承比较简单,而虚拟继承对学习c++的难度较大。  首先,虚拟继承与普通继承的区别有:  假设derived 继承自base类,那么derived与base是一种“is a”的关系,即derived类是base类,而反之错误;  ...
  • C++构造函数按下列顺序调用:  (1)任何虚拟基类的构造函数按照它们被继承的顺序构造;  (2)任何非虚拟基类的构造函数按照它们被继承的顺序构造;  (3)任何成员对象的构造函数按照它们声明的顺序调用;  (4...
  • C++构造函数和析构函数的调用顺序举例一.调用方法和区别1、构造函数的调用顺序: 基类构造函数、对象成员构造函数、派生类本身的构造函数 2、析构函数的调用顺序
  • C++构造函数处理顺序

    2018-08-22 21:18:26
    C++构造函数处理顺序如下: 1、为传入的非引用实参通过拷贝构造函数建立临时变量,引用实参省略这一步。 2、调用基类构造函数。 3、处理成员变量的初始化工作,按照成员变量定义的顺序进行初始化。初始化列表里的...
  • C++】在多继承>中,类构造函数调用顺序

    多人点赞 热门讨论 2022-05-12 16:48:49
    本篇笔记是对于继承知识的相关小结,以及继承中的构造函数调用顺序
  • 主要介绍了C++构造函数初始化顺序详解,是对C++代码的运行机制深入探讨,需要的朋友可以参考下
  • 静态变量在所在函数第一次被调用调用构造函数、在程序结束时调用析构函数,只调用一次。 局部变量在所在的代码段被执行时调用构造函数,在离开其所在作用域(大括号括起来的区域)时调用析构函数。可以调用任意多...
  • C++构造函数调用构造函数 #include &lt;stdlib.h&gt; #include &lt;iostream&gt; using namespace std; struct CLS { int m_i; CLS( int i ) : m_i(i){} CLS() {...
  • C++构造函数按下列顺序调用:(1、2、3、4是按照优先级顺序来的!) (1)任何虚拟基类的构造函数按照它们被继承的顺序构造; (2)任何非虚拟基类的构造函数按照它们被继承的顺序构造; (3)任何成员对象的构造函数...
  • 子类和父类的构造函数调用顺序 当创建子类对象时, 构造函数调用顺序: 静态数据成员的构造函数 -> 父类的构造函数 -> 非静态的数据成员的构造函数 -> 自己的构造函数 注意: 无论创建几个对象, 该类的...
  • c++ 子类父类 的构造函数调用顺序

    千次阅读 2017-09-01 21:40:25
    调用基类的构造函数,再调用派生类的构造函数 就像盖楼的时候先从地基开始,然后第一层,第二层。 如果是析构,那么先调用派生类的析构函数,再调用基类的析构函数 就像拆楼的时候想从最高层开始拆,然后往下...
  • c++构造函数和析构函数的调用顺序

    千次阅读 2019-04-22 14:33:45
    在使用构造函数和析构函数时,需要特别注意对他们的调用时间和调用顺序,在一般情况下,调用析构函数的次序正好与调用构造函数的次序相反,最先被调用的构造函数,其对应(同一对象中的)析构函数最后被调用,而最后...
  • C/C++---中多继承构造函数调用顺序

    千次阅读 2018-09-15 19:03:28
     //第四步:在初始化列表里找到memberB1(c),初始化一个B1对象,用c为参数,则调用B1的构造函数,打印"constB13"  //第五步:在初始化列表里找到memberB2(d),初始化一个B2对象,用d为参数,则调用B2的构造函数,...
  • 下面小编就为大家带来一篇C++聚合关系类的构造函数调用顺序详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考,一起跟随小编过来看看吧

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 126,014
精华内容 50,405
关键字:

c++构造函数调用顺序

c++ 订阅