首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++ 构造函数初始化调用顺序及类函数内部嵌套函数情况

(1)任何虚拟基类的构造函数按照它们被继承的顺序构造; (2)任何非虚拟基类的构造函数按照它们被继承的顺序构造; (3)任何成员对象的构造函数按照它们声明的顺序调用;(如果成员对象有前面出现过的父类...,那么还会调用此对象父类的构造函数一遍,因为第一遍(1)(2)是为了创建子类,第二遍调用是为了构造里面的成员对象。)...(4)类自己的构造函数。  ...B2、B1、B3是C的基类,按照上述的顺序,我们先要构造基类,然后才是子对象,最后是其本身的构造函数所以先要执行这三个类的构造函数。...总结 : 我们必须明确的是当一个类继承与基类,并且自身还包含有其他类的成员对象的时候,构造函数的调用顺序为:调用基类的构造函数->调用成员对象的构造函数->调用自身的构造函数。

23310

子类A继承父类B, A a = new A(); 则父类B构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块 执行的先后顺序是?

(1)子类A继承父类B, A a = new A(); 则: 父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数 (2)若子类构造函数中显式的调用了父类的某构造函数...,则调用该构造函数 class C { C() { System.out.print("C"); } } class A { C c = new C();...,但是该类继承自A,所以要先调用父类的构造方法,这里通过super(“B”)显示的调用了父类的带参构造。...执行父类的带参构造前要先对父类中的对象进行初始化,对父类中的c成员进行初始化,调用了C类的无参构造,所以调用顺序为: 先调用C类的无参构造 再调用A类的带参构造 最后调用调用子类的构造 (3...顺序为:父类的静态变量, 父类的静态代码块 ,子类的静态变量,子类的静态代码块。

2.2K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C++】构造函数初始化列表 ② ( 构造函数 为 初始化列表 传递参数 | 类嵌套情况下 的 构造函数 析构函数 执行顺序 )

    , B 类的 有参构造函数 , 传入了 3 个参数 , 这三个参数都不在函数体中使用 , 而是在 参数列表中使用 , // 构造函数中的参数可以作为 B(int age, int ageOfA,..., 类 A 定义了 2 个参数的 有参构造函数 ; 类 B 定义了 无参构造函数 , 但是在该 无参构造函数 中 , 定义了函数列表 B() : m_age(10), m_a(10, 150) , 在该函数列表中..., 执行了 A 的构造函数 ; 类 B 中还定义了 有参构造函数 , 接收 3 个参数 , 分别作为 m_age 成员的值 , 和 A 类型成员对象的 有参构造函数 的 2 个参数 , 这是 使用了...0; } 执行结果 : 二、类嵌套情况下 的 构造函数 / 析构函数 执行顺序 ---- 1、构造函数 / 析构函数 执行顺序 类 B 中 定义了 A 类型 的 成员变量 ; A 类型对象 是 被组合对象...初始化列表 的顺序 进行初始化 ; 析构函数执行顺序 : 析构函数 与 构造函数 的执行顺序 相反 ; 2、代码示例 - 构造函数执行顺序 下面的代码中 , 在 B 类中定义 A 类型 成员变量 ;

    26230

    scala 学习笔记(04) OOP(上)主从构造器私有属性伴生对象(单例静态类)apply方法嵌套类

    一、主从构造器 java中构造函数没有主、从之分,只有构造器重载,但在scala中,每个类都有一个主构造器,在定义class时,如果啥也没写,默认有一个xxx()的主构造器 class Person {...,这一点类似c#中的static静态类,使用时直接按静态方法调用即可: var obj1 = Singleton.count println(obj1) Singleton.increment...从object的使用上,还可以看出静态方法的调用上scala与java的不同,java中静态方法即可以用"类名.静态方法()",也可以用"对象实例.静态方法()"来调用,说实话,有点不太讲究,而Scala...内部还可以再定义类,即嵌套类,与java不同的是,scala的嵌套类是属于实例的,而不属于定义它的外部类。...这句话听着很绕,还是直接看代码吧,先把前面的People类改造一下: class People(var name: String) { /** * 定义嵌套类(注:必须写在最开始,好象也只能定义一个

    92680

    类的实例化顺序:静态数据、构造函数和字段的执行顺序详解

    引言 在面向对象编程中,类的实例化是一个重要的概念。当我们创建一个类的实例时,其中涉及到多个步骤,包括父类和子类的静态数据初始化、构造函数的执行以及字段的初始化。...这些静态数据在整个类层次结构中只会初始化一次。 父类的构造函数:接着,父类的构造函数会被调用。父类的构造函数可能会执行一些初始化操作,例如设置实例字段的默认值。...子类的静态数据初始化:在父类的静态数据初始化完成后,子类的静态数据也会被初始化。同样,这些静态数据在整个类层次结构中只会初始化一次。 子类的构造函数:最后,子类的构造函数被调用。...子类的构造函数通常会首先调用父类的构造函数,然后执行子类自己的初始化操作。 字段的初始化:在构造函数执行期间,类的实例字段(非静态字段)会被初始化。...字段的初始化: 所有字段的初始化都在构造函数中完成。 实例化顺序总结 通过上述示例和步骤分析,我们可以总结类的实例化顺序如下: 父类的静态数据初始化。 父类的构造函数,包括父类的字段初始化。

    86020

    多个类多线程环境下静态构造函数的执行顺序

    实体类A的静态构造函数中可能会开一个线程去执行方法B,然后静态构造函数接着执行后续方法C,问题就在于B和C都会争夺同一个锁,如果B拿到这个锁,它会创建一个A的实例,但是因为A的静态构造函数正常执行C,C...TEntity的静态构造函数。...(type)创建类型type的实例,加入字典,也就是实体类本身的实例。...答案: 上面微软的答复邮件说得很清楚,静态构造函数只会被调用一次,并且在它执行完成之前,任何其它线程都不能创建这个类的实例或使用这个类的静态成员!...测试代码中,在A的静态构造函数里面使用了匿名函数,而编译器会把它编译成为A的一个静态方法,因此,它就成了A的静态成员了,所以…… 实际上,我们没注意到的地方是第四点,太粗心了!

    88270

    【C++】运算符重载案例 - 字符串类 ① ( Visual Studio 中创建 String 类 | 构造函数与析构函数 | 完整代码示例 )

    一、Visual Studio 中创建 String 类 右键点击 " 解决方案资源管理器 " 中的 解决方案 名称 , 在弹出菜单中 , 选择 " 添加 / 类 " 选项 ; 输入 String 类名...---- 1、成员变量 定义 String 类的 构造函数 , 成员函数 与 成员变量 ; 成员变量主要有 2 个 , 分别是 字符串长度 int m_len , 注意 : 字符串长度 ,..." << endl; } 3、有参构造函数 有参构造函数 , 接收一个 char* 类型字符串指针 ; 需要分 2 种情况进行讨论 , 如果传入为 NULL , 就创建 空 字符串 ; 如果传入非空字符串...#include "iostream" using namespace std; // 导入自定义的 String 类 #include "String.h" int main() { // 调用无参构造函数...system("pause"); return 0; } 4、执行结果 执行结果 : 调用无参构造函数 调用有参构造函数 调用拷贝构造函数 请按任意键继续. . .

    25020

    java(4)-深入理解java嵌套类、内部类以及内部类builder构建构造函数六、使用 builder 模式解决构造方法参数过多的情况

    一、什么是嵌套类及内部类   可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类。...静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。嵌套类从JDK1.1开始引入。...二、静态嵌套类  如下所示代码为定义一个静态嵌套类,   public class StaticTest {    private static String name = "javaJohn...应该为这样的类编写什么样的构造方法或静态工厂?...如果客户端意外地反转了两个这样的参数,编译器并不会抱怨,但是程序在运行时会出现错误行为 当在构造方法中遇到许多可选参数时,另一种选择是 JavaBeans 模式,在这种模式中,调用一个无参数的构造函数来创建对象

    1.6K10

    【C++】构造函数分类 ② ( 在不同的内存中创建类的实例对象 | 栈内存中创建实例对象 | new 关键字创建对象 )

    一、在不同的内存中创建类的实例对象 1、栈内存中创建实例对象 在上一篇博客 【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用...) 中 , 介绍了 三种类型的 构造函数 , 并在 main 函数中 分别 调用了这 3 种构造函数 ; 下面的调用方式 , 调用一个构造函数 , 创建 Student 类实例对象 , 最终将实例对象赋值给了...栈内存中的 变量 Student s1 ; 这些都是在 栈内存 中创建 类的实例对象 的情况 ; // 调用无参构造函数 Student s1; // 打印 Student s1 实例对象值..., 栈内存中只占 4 字节的指针变量大小 ; Student* s2; 在 C++ 语言中 , 可以使用 new 关键字 , 调用有参构造函数 , 创建类的 实例对象 ; 在下面的 C++ 代码中 ,...声明并定义了 MyClass 类 , 该类定义了一个有参构造函数 , 接受两个整数作为 构造函数参数 ; 在 main 函数中 , 使用 使用 new 关键字 来调用 有参构造函数 创建 MyClass

    18820

    【面试题】Java中子类和父类静态代码块、非静态代码块、构造函数的执行顺序总结一览表

    在面试的时候,有时候我们会被问到这样的问题:子类A继承父类B,A a = new A();则父类B的构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块执行的先后顺序是什么...执行的时机:类被加载的时候。二:非静态代码块非静态代码块是用来初始化类实例信息的。当我们new关键字创建一个对象的时候,就会被执行,而且每使用一个new关键字创建出一个新对象的时候就会被执行一次的。...非静态代码块也可以叫作:非静态初始化代码块的运行时机:会在构造函数执行时候,在构造函数代码执行之前被运行的三:构造函数构造函数或者构造方法不用多说了吧,就是用来创建对象的。...如下图:2:父类和子类中静态代码块、非静态代码块、构造函数的执行顺序:父类中的静态代码块→子类中的静态代码块→父类非静态代码块→父类构造函数→子类非静态代码块→子类构造函数具体加载如下图:所以,根据上面的分析...父类B的中的非静态代码块 sya() 父类B的构造函数 子类A的中的非静态代码块 sya()1 子类A的构造函数 启动完成总之一句话总结:父类早于子类、静态早于非静态、非静态早于构造函数

    63051

    Java内部类详解

    内部类 内部类(nested classes),面向对象程序设计中,可以在一个类的内部定义另一个类。嵌套类分为两种,即静态嵌套类和非静态嵌套类。...使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。 2. 匿名内部类中是不能定义构造函数的。 3....我们知道非静态嵌套类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围内,但是静态嵌套类却没有。没有这个引用就意味着。 1....静态嵌套类的创建是不需要依赖于外围类,可以直接创建 2. 静态嵌套类不可以使用任何外围类的非static成员变量和方法,而内部类(即为非静态嵌套类)则都可以。...以上就是所有的java内部类的各种模式的简单例子 大家要注意一点,java中只能在内部类中创建静态成员的类,也就是静态嵌套类,也有很多人疑惑为什么 java 静态嵌套部类中可以有非静态成员,还有为什么可以

    82621

    创建子类对象时,父类构造函数中调用被子类重写的方法为什么调用的是子类的方法?

    public static void main(String[] args) { A a = new A(); B b = new B(); } } 问题:为什么创建...但是:创建B对象父类会调用父类的方法? 答案: 当子类被加载到内存方法区后,会继续加载父类到内存中。...如果,子类重写了父类的方法,子类的方法引用会指向子类的方法,否则子类的方法引用会指向父类的方法引用。 如果子类重载了父类方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载父类方法,则方法引用会指向父类方法。 当子类对象创建时,会先行调用父类的构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...但是:由于java语言是静态多分派,动态单分派。其结果是当编译的时候,父类构造方法调用的方法的参数已经强制转换为符合父类方法的参数了。 上边代码在编译前已经转换为下面这个样子的了。

    6.2K10

    Android面试题之Kotlin的几种常见的类

    初始化的顺序 主构造函数里声明的属性 类级别的属性赋值 init初始化块里的属性赋值和函数调用 次构造函数里的属性赋值和函数调用 延迟初始化 lateinit关键字用来延迟初始化 isInitialized...println("study...") } } } fun main() { //嵌套类 Student.Study().study() } 数据类 data...修饰符 实现了toString方法,equals方法和hashcode方法,==符号比较的是属性值 实现了copy函数,调用copy函数会生成一个新对象,构造方法走的是主构造方法,不会走次构造方法,也就是次构造函数里初始化的属性不会...copy过来 支持解构语法 支持运算符重载 数据类使用条件 经常需要比较、复制或打印自身内容的类,数据类尤其适合 数据类必须有至少带一个参数的主构造函数 主构造函数的参数必须是val或是var 数据类不能使用...使用object关键字可以定义单例类 object关键字有三种使用方式 对象声明,生成单例 对象表达式,就类似匿名内部类,new onClickListener 伴生对象,类似静态方法或是静态属性 枚举类

    8610

    this指针用法

    由此可见,this在成员函数的开始前构造的,在成员的结束后清除。 这个生命周期同任一个函数的参数是一样的,没有任何区别。 当调用一个类的成员函数时,编译器将类的指针作为函数的this参数传递进去。...如: A a; a.func(10); 此处,编译器将会编译成: A::func(&a, 10); 嗯,看起来和静态函数没差别,对吗?不过,区别还是有的。...回答 #1:this指针是什么时候创建的? this在成员函数的开始执行前构造的,在成员的执行结束后清除。 #2:this指针存放在何处? 堆,栈,全局变量,还是其他?...类实例后的函数,没有这个说法。类在实例化时,只分配类中的变量空间,并没有为函数分配空间。自从类的函数定义完成后,它就在那儿,不会跑的。 #4:this指针如何访问类中变量的/?...普通的类函数(不论是成员函数,还是静态函数),都不会创建一个函数表来保存函数指针的。只有虚函数才会被放到函数表中。

    44420

    C++中this指针的使用方法.

    由此可见,this在成员函数的開始前构造的,在成员的结束后清除。 这个生命周期同任一个函数的參数是一样的,没有不论什么差别。 当调用一个类的成员函数时,编译器将类的指针作为函数的this參数传递进去。...如: A a; a.func(10); 此处,编译器将会编译成: A::func(&a, 10); 嗯,看起来和静态函数没区别,对吗?只是,区别还是有的。...回答 #1:this指针是什么时候创建的? this在成员函数的開始运行前构造的,在成员的运行结束后清除。 #2:this指针存放在何处? 堆,栈,全局变量,还是其它?...类实例后的函数,没有这个说法。类在实例化时,仅仅分配类中的变量空间,并没有为函数分配空间。自从类的函数定义完毕后,它就在那儿,不会跑的。 #4:this指针怎样訪问类中变量的/?...普通的类函数(不论是成员函数,还是静态函数),都不会创建一个函数表来保存函数指针的。仅仅有虚函数才会被放到函数表中。

    1.2K20

    Java笔记

    data;i++){}static修饰的方法或变量是在创建新类之前就创建了不能用实例调用static,直接用类名调用,只要是静态的东西,都可以类名点直接获取创建静态内部对象的格式: 外部类名.内部类名...内部类(嵌套类):定义在另一个类(外部类)内部的类,它可以访问外部类的所有成员,包括私有成员。...局部内部类:定义在方法、构造器或块内的类,作用域仅限于该方法或构造器。 匿名内部类:没有名称的内部类,通常用于简洁地实现接口或抽象类的一个实例。...静态内部类(嵌套类):用 static 关键字声明,不直接与外部类的实例关联,可以像普通类一样创建对象。 访问权限: 内部类可以直接访问外部类的所有成员,包括私有成员和静态成员。...静态内部类常用于创建与外部类紧密相关的辅助类,但不需要外部类的实例。

    8210

    C#关键字常见面试题

    静态构造函数只调用一次,在程序所驻留的应用程序域的生存期内,静态类会保留在内存中(即使用Static修饰的类,应用一旦启用静态类就会保留在内存中)。 静态类只包含静态成员 不能包含实例构造函数。...静态类会进行密封,因此不能继承。它们不能继承自任何类(除了 Object)。静态类不能包含实例构造函数。但是,它们可以包含静态构造函数。 静态成员和非静态成员的区别?...成员主要指的是:字段、方法、属性、运算符、事件和构造函数等。 静态成员用static修饰符,非静态成员不需要。 静态成员属于类所有,非静态成员属于类的实例化对象所有。...静态方法里不能使用非静态成员,非静态方法可以使用静态成员。 每创建一个类的实例,都会在内存中为非静态成员新分配一块新的存储。 静态成员无论类创建多少个实例,在内存中只占同一块区域。...它可以用来区分局部变量和实例变量、在构造函数中调用其他构造函数、传递当前对象给其他方法等。 base 关键字有什么作用? base 关键字表示基类的引用,可以用于访问基类的成员。

    17310

    Kotlin学习日志(五)类与对象

    上面的代码中,两个构造函数之间只有一个输入参数的区别,所以完全可以把二者合二为一,变成一个带默认参数的主构造函数,新的主构造函数既能输入两个参数,又能输入三个参数,新创建一个类AnimalDefault...二、类的成员 2.1成员属性 创建一个新的类WildAnimal,然后在构造函数中放两个参数,代码如下: class WildAnimal(name:String,sex:Int = 0) {...Kotlin的类成员分为实例成员与静态成员,实例成员包括成员属性和成员方法,其中与入参同名的成员属性可以在构造函数中直接声明,外部必须通过类的实例才能访问类的成员属性和成员方法,类的静态成员包括静态属性与静态方法...,如果没戴open帽子,该类就只好打光棍了,函数没戴open帽子的话,类的孩子就没有办法修改它。...这对于开发者来说无疑于一个繁琐的工作,而Kotlin鉴于此,推出了名为“数据类”这样的骚操作,其实说起来也比较简单,数据类的定义仅仅只要在class前面增加关键字data,并声明拥有完整输入参数的构造函数

    1.2K20

    最强总结 | 带你快速搞定kotlin开发(中篇)

    主构造器是类头部的一部分, 位于类名称(以及可选的类型参数)之后,并且有一点与Java不同,就是在主构造器中我们可以直接声明成员属性。...kotlin比较灵性的一点是对于使用data class声明的类,会自动的根据构造属性生成对应的函数。 data class User(var name: String?...: repeat(100) { println(it) } 局部函数 说白了就是函数里面再嵌套个函数,局部函数里面可以访问外部函数的属性,有人可能要问设计这种函数有啥用...需要注意的是,这种嵌套的方式每次在外部函数被调用的时候会生成一个额外的对象,所以如果调用比较平凡的函数还是不要在里面嵌套内部函数。...this代指调用此扩展函数的对象,本质上其实我们并没有为类真的新增一个成员函数,当然如果类的成员函数和你的扩展函数一样,会优先调用成员函数的,其本质是什么呢?

    70020

    【C++】static关键字及其修饰的静态成员变量函数详解

    static 被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间,静态数据成员按定义出现的先后顺序依次初始化,注意静态成员嵌套时,要保证所嵌套的成员已经初始化了。...实现一个可以计算程序中正在使用的类对象有多少的类 我们可以利用对象创建必调用构造,而销毁必调用析构函数的特性,在类里创建一个static类对象来记录类对象的创建数/销毁数。...: 综上,对于类对象的创建数/销毁数的记录工作,可以从下面三个方向入手: 类对象的创建数=构造函数静态成员变量++ 类对象的销毁数=析构函数静态成员变量++ 类对象的在生命周期数=构造函数静态成员变量....将构造函数封装起来是为了不让类外的函数随便不按要求构造类对象,如: 2.使用成员函数来创建类对象是因为成员函数调用类函数不受访问限定符的限制,如: 3.使用static修饰成员函数是因为要解决无类对象就无法调用类成员函数的问题...其次,我们在主函数创建一个n个Sum类数据的数组,这意味着将要创建n个Sum类对象,则Sum的构造函数会被调用n次。

    2.7K11
    领券