精华内容
下载资源
问答
  • 构造函数执行顺序
    千次阅读
    2018-11-17 19:32:18

    通过示例说明:

    #include <iostream>
    
    class Base
    {
    public:
        Base();
        virtual void f();
        virtual void func();
    };
    
    Base::Base()
    {
        std::cout << "Base construct" << std::endl;
        f();
    }
    
    void Base::func()
    {
        f();
    }
    void Base::f()
    {
        std::cout << "Base f() called" << std::endl;
    }
    
    class Devied : public Base
    {
    public:
        Devied();
        void f();
    };
    
    Devied::Devied()
    {
        std::cout << "Devied construct" << std::endl;
    }
    
    void Devied::f()
    {
        std::cout << "Devied f() called" << std::endl;
    }
    
    //by zhaocl
    int main()
    {
        Devied d;
        d.func();
        system( "pause" );
        return 0;
    }

    运行结果:

    Base construct
    Base f() called
    Devied construct
    Devied f() called

    基础知识点总结:

    1、构造函数先父类再子类,所以先 Base 再 Decied

    2、Base 中调用 f() ,该函数是一个虚函数,所以一般会调用 Devied::f(),因为对象d是Devied类型的,查看Base::Func() 中的函数调用可以得出结果。但是,如果是在Base的构造函数中调用,因为此时Devied还没构造,对象还不是Devied类型,所以调用的是Base::f(),这个查看构造函数中的函数调用可以看出。

    更多相关内容
  •  3 构造函数,(创建对象时执行完2后再执行构造函数,不管构造函数是public还是private) */ public class Test{ public Test(){ System.out.println("类Test构造方法被执行 6"); } { System.out.println("类...
  • 新建子类对象时一定会调用父类的无参构造函数 子类调用有参构造函数前会调用父类的无参构造函数 子类调用无参构造函数前会调用父类的无参构造函数 若父类定义了有参构造函数而没有定义无参构造函数,则报错 若父类...

    新建子类对象时一定会调用父类的无参构造函数

    • 子类调用有参构造函数前会调用父类的无参构造函数
    • 子类调用无参构造函数前会调用父类的无参构造函数

    若父类定义了有参构造函数而没有定义无参构造函数,则报错

    若父类没有定义任何构造函数,则自动生成无参构造函数

    public class parent {
        public parent() {
            System.out.println("这里是父类的无参构造函数");
        }
        private parent(String name) {
            System.out.println("这里是父类的有参构造函数");
        }
    }
    class son extends parent{
        public son(){
            System.out.println("这里是子类的无参构造函数");
        }
        public son(String name){
            System.out.println("这里是子类的有参构造函数");
        }
    
        public void getname(){
            System.out.println("这里是子类独有的方法");
        }
        public static void main(String[] args) {
            //子类对象可以赋值给父类对象 但是子类的独有的方法自动隐藏
            parent a = new son("shen");
            //a中无法调用getname方法
            son b = new son("shen1");
            b.getname();
        }
    }
    

    输出为:

    这里是父类的无参构造函数
    这里是子类的无参构造函数
    这里是父类的无参构造函数
    这里是子类的有参构造函数
    这里是子类独有的方法
    
    
    展开全文
  • 派生类的构造函数执行顺序

    千次阅读 2020-11-06 21:54:00
    构造函数执行顺序 1,调用基类构造函数。 顺序按照它们被继承时声明的顺序(从左向右)。 2,对初始化列表中的成员进行初始化。 顺序按照它们在类中定义的顺序。 对象成员初始化时自动调用其所属类的构造函数。由...

    1.当基类有默认构造函数时
    派生类构造函数可以不向基类构造函数传递参数。
    构造派生类的对象时,基类的默认构造函数将被调用。

    2.如需执行基类中带参数的构造函数
    派生类构造函数应为基类构造函数提供参数。

    构造函数的执行顺序
    1,调用基类构造函数。
    顺序按照它们被继承时声明的顺序(从左向右)。

    2,对初始化列表中的成员进行初始化。
    顺序按照它们在类中定义的顺序。
    对象成员初始化时自动调用其所属类的构造函数。由初始化列表提供参数。

    3,执行派生类的构造函数体中的内容。

    #include <iostream>
    using namespace std;
    class Base1 {//基类Base1,构造函数有参数
    public:
        Base1(int i) 
      { cout << "Constructing Base1 " << i << endl; }
    };
    class Base2 {//基类Base2,构造函数有参数
    public:
        Base2(int j) 
      { cout << "Constructing Base2 " << j << endl; }
    };
    class Base3 {//基类Base3,构造函数无参数
    public:
        Base3() 
      { cout << "Constructing Base3 *" << endl; }
    };
    
    class Derived: public Base2, public Base1, public Base3 {
    public: 
        Derived(int a, int b, int c, int d): Base1(a), member2(d), member1(c), Base2(b)
      //此处的次序与构造函数的执行次序无关
        { }
    private:
        Base1 member1;
        Base2 member2;
        Base3 member3;
    };
    
    int main() {
        Derived obj(1, 2, 3, 4);
        return 0;
    }
    
    展开全文
  • c# 构造函数执行顺序

    2017-02-04 17:53:00
    这些构造函数中可能有一个默认的构造函数,默认的构造函数没有参数,与类同名。其它带参数的构造函数称为非默认的构造函数。 在类的外部不能用私有的构造函数实例化对象,通过把默认的构造函数设置为私有,就可以...

    转载自 http://blog.csdn.net/gshgsh1228/article/details/50867274

     

    所有的类都至少包含一个构造函数。这些构造函数中可能有一个默认的构造函数,默认的构造函数没有参数,与类同名。其它带参数的构造函数称为非默认的构造函数。

    在类的外部不能用私有的构造函数实例化对象,通过把默认的构造函数设置为私有,就可以强制类的用户使用非默认的构造函数。

    一些类没有公共的构造函数,外部代码就不能实例化它。

    静态成员,也称为共享成员,可以在类的实例之间共享。静态成员通过类直接引用。

    一个类只能有一个静态的构造函数,该构造函数不能有访问修饰符,也不能带任何参数。静态构造函数不能直接调用,只能在下述情况下执行:

    (1)创建包含静态构造函数的类的实例时

    (2)访问包含静态构造函数的类的静态成员时

    非静态构造函数也称实例构造函数。

    静态类只包含静态成员,且不能用于实例化对象(如Console)。

    任何构造函数都可以配置为在执行自己的代码前调用其他构造函数。

    创建类的实例时,会调用类的构造函数,为了实例化派生的类,必须实例化它的基类;要实例化这个基类,有必须实例化这个基类的基类,这样一直实例化System.Object(所有类的根),因此无论使用什么构造函数实例化一个类,总是首先调用System.Object.Object().

    下面用例子说明构造函数的执行顺序:

    publicclass MyBaseClass

    {

      Public MyBaseClass()

    {

    }

      Public MyBaseClass(int i)

      {

      }

    }

    publicclass MyDerivedClass:MyBaseClass

    {

      public MyDerivedClass()

      {

      }

      public MyDerivedClass(int i)

      {

      }

      public MyDerivedClass(int i,int j)

      {

      }

    }

     

    使用下面语句实例化MyDerivedClass

    MyDerivedClass myObj=new MyDerivedClass();

    构造函数执行顺序如下:

    (1)执行System.Object.Object()

    (2)执行MyBaseClass.MyBaseClass()

    (3)执行MyDerivedClass.MyDerivedClass()

    另外,使用下面语句实例化MyDerivedClass

    MyDerivedClass myObj=newMyDerivedClass(4,8);

    构造函数执行顺序如下:

    (1)执行System.Object.Object()

    (2)执行MyBaseClass.MyBaseClass()

    (3)执行MyDerivedClass.MyDerivedClass(int i,int j)

    如果我们想要得到下面的执行顺序:

    (1)执行System.Object.Object()

    (2)执行MyBaseClass.MyBaseClass(inti)

    (3)执行MyDerivedClass.MyDerivedClass(int i,int j)

    可以使用base关键字指定.NET实例化过程中使用基类中具有指定参数的构造函数,即:

    publicclass MyDerivedClass:MyBaseClass

    {

      public MyDerivedClass()

      {

      }

      public MyDerivedClass(int i)

      {

      }

      public MyDerivedClass(int i,int j):base(i)

      {

      }

    }

    这样将不会调用MyBaseClass.MyBaseClass()

    除base关键字外,关键字this也可指定构造函数初始化器。这个关键字指定在调用指定的构造函数前,.NET实例化过程对当前类使用非默认的构造函数。

    例如:

    publicclass MyDerivedClass:MyBaseClass

    {

      publicMyDerivedClass():this(5,6)

      {

      }

      public MyDerivedClass(int i)

      {

      }

      publicMyDerivedClass(int i,int j):base(i)

      {

      }

    }

    使用MyDerivedClass. MyDerivedClass()构造类,将执行下列序列:

    (1)执行System.Object.Object()

    (2)执行MyBaseClass.MyBaseClass(inti)

    (3)执行MyDerivedClass.MyDerivedClass(int i,int j)

    (4)执行MyDerivedClass.MyDerivedClass()

    转载于:https://www.cnblogs.com/TJessica/p/6366066.html

    展开全文
  • 成员变量和构造函数执行顺序

    千次阅读 2017-11-30 13:18:19
    Java虚拟机创建一个对象都包含以下步骤。 (1)给对象分配内存。 (2)将对象的实例变量自动初始化为其变量类型的默认值。 ...(3)初始化对象,给实例变量赋予正确的初始值。...成员变量优先于构造函数
  • 1,静态变量、静态代码块、变量、普通代码块、mian方法、构造函数执行顺序是:(静态变量、静态代码块)> main方法 >(变量、普通代码块)>构造函数。2,如果子类调用了父类,那么执行顺序是:(父类静态变量...
  • C++构造函数执行顺序

    千次阅读 2017-09-08 10:29:49
    一、先执行静态成员的构造函数,如果静态成员只是在类定义中声明了,而没有实现,是不用构造的。必须初始化后才执行构造函数。 二、任何虚拟继承基类的构造函数按照它们被继承的顺序构造(不是初始化列表中的...
  • C++构造函数处理顺序

    2018-08-22 21:18:26
    C++构造函数处理顺序如下: 1、为传入的非引用实参通过拷贝构造函数建立临时变量,引用实参省略这一步。...4、执行构造函数用户定义初始化内容 先看一段代码 #include &lt;iostream&gt; using n...
  • 分析:B类无参的构造函数中的this语句并没有影响到父类A类的构造函数执行顺序 *********************************** 分割线*********************************** 实验二 ...
  • 构造函数执行顺序

    千次阅读 2017-06-14 20:32:04
    执行静态成员的构造函数,如果静态成员只是在类定义中声明了,而没有实现,是不用构造的。必须初始化后才执行构造函数。 任何抽象基类的构造函数按照它们被继承的顺序构造(不是初始化列表中的顺序) 任何虚拟...
  • 子类与父类构造函数调用顺序

    千次阅读 2021-02-22 17:12:06
    子类与父类构造函数调用顺序 构造函数 当创建子类对象时, 构造函数的调用顺序: 静态数据成员的构造函数 -> 父类的构造函数 -> 非静态的数据成员的构造函数 -> 自己的构造函数 注意: 无论创建几个对象, ...
  • 在JavaSE的基础笔试题中经常会出现这三个的一个执行顺序,那么他们的执行顺序究竟是怎么样的呢?通过代码我们可以直接看一下最终结果(代码如下) public class testOne extends TestTwo{ public testOne(){ ...
  • 2静态构造函数,不能访问实例成员,只能用来初始化一些静态字段或者属性,仅在第一次调用类的任何成员时自动执行,不带访问修饰符,不带任何参数,每个类只能有一个静态构造函数,但可以同时还有一个无参实例构造...
  •  先看看构造函数的调用顺序规则,只要我们在平时编程的时候遵守这种约定,任何关于构造函数的调用问题都能解决;构造函数的调用顺序总是如下:  1.基类构造函数。如果有多个基类,则构造函数的调用顺序是某类在...
  • 派生类的构造函数/析构函数执行顺序创造一个子类对象时(new一个子类对象或在栈中构造),先执行父类的构造函数,再执行自身的构造函数。如果子类继承多个父类,则按照继承的顺序从左到右调用父类构造函数(类继承列表...
  • c++中构造函数的调用顺序

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

    千次阅读 2012-07-25 15:52:28
     在多重继承中,派生类的构造函数与单继承下派生类构造函数相似,它必须负责该派生类所有基类构造函数以及对象成员(如果有的话)构造函数的调用。同时,派生类的参数必须包含完成所有基类、对象成员以及派生类中...
  • 关于类中对象成员的构造函数和类自身构造函数执行顺序的问题,我们通过一段简单的程序来验证,测试代码如下: #include <stdio.h> class A { public: A() { printf("AAAAA\n"); }; ~A(){}; ...
  • 继承下构造函数执行顺序

    千次阅读 2015-09-15 22:41:21
    一个派生类构造函数执行顺序如下: 第一步执行:虚拟基类的构造函数(多个虚拟基类则按照继承的顺序执行构造函数)。 第二步执行:基类的构造函数(多个普通基类也按照继承的顺序执行构造函数)。 第三步执行:...
  • C++构造函数调用顺序

    千次阅读 多人点赞 2019-06-24 09:49:26
    C++构造函数按下列顺序被调用: (1)任何虚拟基类的构造函数按照它们被继承的顺序构造; (2)任何非虚拟基类的构造函数按照它们被继承的顺序构造; (3)任何成员对象的构造函数按照它们声明的顺序调用; (4)类自己...
  •  在说构造函数之前我们得先弄明白几个问题,首先是什么是类的构造函数,什么是类的成员对象,什么是基类,然后我们再来说构造函数的调用顺序。  1、 类的构造函数  构造函数的功能主要用于在类的对象创建时定义...
  • C#构造函数执行顺序

    千次阅读 2017-03-23 21:56:18
    构造函数的作用是初始化一个新对象,构造函数实在对象初始化的时候优先调用。readonly 字段可以直接在定义中进行...构造函数执行顺序:如下public class MyBaseClass { public MyBaseClass() { } public MyBaseCl
  • 一、成员初始化整体顺序 1.成员赋值初始化先于构造函数; 2.成员赋值初始先从子类再到基类; 3.构造函数初始化先从基类再...3.执行类的静态构造函数。 三、对类型实例成员构造的大致过程 1.分配实例成员的内存...
  • 执行的时候如果有静态初始化块,先执行静态初始化块再执行非静态初始化块,非静态初始化块会在构造函数执行时,在构造函数主体代码执行之前被运行。 构造方法:是用来创建对象的。 执行顺序:静态代码块>非静态...
  • 派生类构造函数执行顺序       下面给出一个例子   代码: 1 #include 2 3 using namespace std; 4 5 6 //打印函数名辅助宏 7 #define PRINT_FUNC_NAME()\ 8 cout endl; 9 10...
  • 下面示例就是说明多重继承析构函数和构造函数执行顺序: #include <iostream> using namespace std; class A { public: A(int i) { cout << "父类A构造函数被调用:" << i<<endl; } ...
  • 我们先来建立一个父类,一个子类,一个子类的子类 ...实例化父类时,可以通过new子类来实例化父类,执行构造函数顺序为:先执行父类的构造函数,再执行子类的构造函数     再见

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 375,013
精华内容 150,005
关键字:

构造函数执行顺序

友情链接: proxySchema.rar