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

为什么我的对象声明不调用默认构造函数?

对象声明不调用默认构造函数的原因可能有以下几种情况:

  1. 对象声明时使用了自定义的构造函数:如果在对象声明时使用了自定义的构造函数,那么默认构造函数将不会被调用。自定义构造函数可以根据需要初始化对象的成员变量或执行其他操作。
  2. 对象声明时使用了初始化列表:初始化列表可以在对象声明时对成员变量进行初始化,而不是在构造函数体内进行初始化。如果对象声明时使用了初始化列表,那么默认构造函数也不会被调用。
  3. 对象声明时使用了拷贝构造函数:如果对象声明时使用了拷贝构造函数,那么默认构造函数也不会被调用。拷贝构造函数用于创建一个新对象,并将已有对象的值复制给新对象。
  4. 对象声明时使用了移动构造函数:如果对象声明时使用了移动构造函数,那么默认构造函数同样不会被调用。移动构造函数用于将一个对象的资源所有权转移给另一个对象,通常用于提高性能和效率。

总结起来,对象声明不调用默认构造函数的原因是因为在声明对象时使用了自定义构造函数、初始化列表、拷贝构造函数或移动构造函数。这些方式可以根据需要对对象进行初始化或进行其他操作,从而满足特定的需求。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Kotlin】Kotlin 构造函数 ( 主构造函数 | 主构造函数声明属性 | init 初始化代码块 | 次构造函数 | 构造函数委托 | 调用构造函数创建实例对象 )

构造函数 ( 常用情况 ) VII . 次构造函数 ( 没有主构造函数 ) VIII . 构造函数 代码执行顺序 IX . 调用构造函数 / 次构造函数 创建类实例对象 I ....主构造函数声明属性 ---- 在类中声明属性可以在类中使用 var / val 属性名称 : 属性类型 声明属性 , 也可以在主构造函数声明属性 ; ① 正常构造函数 : 构造函数是普通构造函数..., 类属性字段在类体中定义 ; /* 主构造函数声明属性 ; */ class Student constructor(name : String, age : Int){ var...; /* 主构造函数声明属性 ; */ class Student constructor(var name : String, var age : Int){ } III . init...调用构造函数 / 次构造函数 创建类实例对象 ---- 1 .

3.8K10
  • JavaScript this 小结纯粹函数调用作为对象方法调用作为构造函数调用apply 调用

    JavaScript 语言一个关键字。 它是函数运行时,在函数体内部自动生成一个对象,只能在函数体内部使用。 ? 上面代码中,函数test运行时,内部会自动有一个this对象可以使用。...下面分情况,详细讨论 纯粹函数调用 函数最通常用法,属全局性调用,this即代表全局对象。 ?...运行结果是1 作为对象方法调用 函数还可以作为某个对象方法调用,这时this就指这个上级对象 ? 结果:1 作为构造函数调用 通过这个函数,可以生成一个新对象。this就指这个新对象。 ?...运行结果为1 为了表明这时this不是全局对象,我们对代码做一些改变: ? 运行结果为2,表明全局变量x值根本没变。 apply 调用 apply()是函数一个方法,作用是改变函数调用对象。...它第一个参数就表示改变后调用这个函数对象。因此,这时this指就是这第一个参数。 ? apply()参数为空时,默认调用全局对象。因此,这时运行结果为0,证明this指的是全局对象

    2.7K20

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

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

    6.2K10

    关于Java构造函数(Constructor)常见问题总结1 为什么调用子类构造方法时候,默认调用父类构造方法2 常见错误:Implicit super constructor is und

    1 为什么调用子类构造方法时候,默认调用父类构造方法 看下面这个简单例子: package cc; public class Sub extends Super { public Sub...这就是为什么我们上面的那个例子程序会先调用super构造方法。 但要切记,** 虽然调用了父类构造方法,但只创建了一个对象也就是子对象。...Paste_Image.png 构造函数使用规则 简单说,在使用时候,子类构造函数必须调用父类构造函数,不管有没有显示声明。所以,被调用父类构造函数,一定在定义好!...为什么Java在一个类已经实现了一个带参构造函数时候,不实现默认无参构造函数? 这是个很有趣问题。...我们知道如果在一个类中没有声明一个构造函数,那么编译器会隐式帮我们实现一个无参构造函数,但如果我们一旦一个构造函数,不管带不带参数,那么编译器都不会提供默认构造函数,所以这么做原因是为什么呢?

    2.9K41

    【C++】类和对象(中):类默认成员函数构造函数、析构函数、拷贝构造函数、运算符重载

    调用时候直接在对象后面加括号然后传参调用 Date d2(2024, 8, 9); d2.Print(); 这里也说一下为什么无参构造函数实例化对象后面不加(),因为加了是下面这个样子。...Date da(); da.Print(); 这里Date da(); 这句到底是函数声明还是对象实例化?这样写就和函数声明区分不开,所以不加括号。 构造函数也可以是全缺省构造函数。...4.对象生命周期结束时,系统自动调用析构函数。 5.跟构造函数类似,我们写编译器自动生成析构函数对内置类型成员不做处理,自定义类型成员会调用析构函数。...这里解释一下为什么拷贝构造第一个参数传参方式必须是引用。 首先我们要知道,C++规定传值传参要调用拷贝构造,没有为什么,就是规定。比如说下面这个f1函数。...这也就是为什么在这一小节开头并没有自己写拷贝构造函数代码但依然可以进行拷贝构造

    8810

    【C++】继承 ⑧ ( 继承 + 组合 模式对象 构造函数 和 析构函数 调用规则 )

    一、继承 + 组合 模式对象 构造函数和析构函数调用规则 1、场景说明 如果一个类 既 继承了 基类 , 又 在类中 维护了一个 其它类型 成员变量 , 那么 该类 构造 与 析构 , 就需要涉及到...类 本身 构造函数 和 析构函数 , 父类 构造函数 和 析构函数 , 类 成员变量 构造函数 和 析构函数 ; 2、调用规则 在 继承 + 组合 情况下 , 构造函数 与 析构函数 调用规则如下..." << endl; } ~C() { cout << "C 析构函数调用" << endl; } public: int z; D d; }; 可根据下面的调用规则 , 分析出 C 类对象中..., 涉及到 父类构造/析构函数 , 自身构造/析构函数 , 成员变量 构造/析构函数 调用顺序 ; 构造函数调用顺序 : 父类 -> 成员 -> 自身 ; 析构函数调用顺序 : 自身 -> 成员...; A 和 B 构造函数 , 是 父类构造函数 ; D 构造函数 , 是 成员构造函数 ; C 构造函数 , 是 自身构造函数 ; 构造函数调用顺序为 : 父类 -> 成员 -> 自身 , 符合上述调用原则

    18310

    【C++修行之道】类和对象(二)类6个默认成员函数构造函数、析构函数

    对象实例化时编译器自动调用对应构造函数构造函数可以重载。...Date d2(2015, 1, 1); // 调用带参构造函数 // 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明 // 以下代码函数声明了d3函数,该函数无参...d对象调用了编译器生成默认构造数,但是d对象_year/_month/_day,依旧是随机值。也就说在这里编译器生成默认构造函数并没有什么用?...确保成员变量正确初始化:自动生成构造函数调用成员变量默认构造函数,确保 MyQueue 中两个 Stack 对象在 MyQueue 对象创建时被正确初始化。...,为什么最后会调用Time类析构函数

    15210

    【C++】匿名对象 ③ ( 函数返回值为对象值时 匿名对象 拷贝构造函数 与 析构函数 调用情况分析 )

    赋值 , 此时 编译器 会将 匿名对象 值赋值给 已存在变量 , 并且立刻销毁该匿名对象 ; 2、拷贝构造函数回顾 在 【C++】拷贝构造函数调用时机 ① ( 使用一个对象初始化另外一个对象 |...将一个对象赋值给另外一个对象 ) 【C++】拷贝构造函数调用时机 ② ( 对象值作为函数参数 | 对象值作为函数返回值 ) 博客中 , 分析了 拷贝构造函数 调用时机 ; " 拷贝构造函数 " 又称为...逐条分析 构造函数 / 拷贝构造函数 / 析构函数 调用过程 : 调用带参数构造函数 m_age = 12 这是在 fun 函数中 , 调用 有参构造函数 , 创建 普通对象 ; 调用拷贝构造函数 这是在...逐条分析 构造函数 / 拷贝构造函数 / 析构函数 调用过程 : 调用带参数构造函数 m_age = 18 这是在 main 函数中 , 调用 有参构造函数 , 创建 普通对象 ; 调用带参数构造函数...m_age = 12 这是在 fun 函数中 , 调用 有参构造函数 , 创建 普通对象 ; 调用拷贝构造函数 这是在 fun 函数中 , 函数返回对象值时 , 创建 要返回 普通对象副本 , 也就是一个

    30220

    深入理解javascript中继承机制(2)临时构造函数模式Uber – 从子对象调用对象接口将继承部分封装成函数

    为了解决前文提到将共有的属性放进原型中这种模式产生对象覆盖掉父对象同名属性问题,就出现了另一种模式,我们称作为临时构造函数模式 临时构造函数模式 我们具体通过代码来分析 function Shape...F,然后将Shape构造函数原型对象赋给F原型。...Uber – 从子对象调用对象接口 传统面向对象编程语言都会有子对象访问父对象方法,比如java中子对象调用对象方法,只要直接调用就可以得到结果了。...,给每个构造函数天价了一个uber属性,同时使他指向父对象原型,然后更改了ShapetoString函数,更新后函数,会先检查this.constructor是否有uber属性,当对象调用toString...时,this.constructor就是构造函数,找到了uber属性之后,就调用uber指向对象toString方法,所以,实际就是,先看父对象原型对象是否有同String,有就先调用它。

    1.6K20

    【C++】C++ 类中 this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

    return s; } 详细代码 , 参考最后完整代码示例 ; 二、有参构造函数设置默认参数值 ---- 为 Student 类定义了有参构造函数 , 则其默认无参构造函数 , 就不会生成...执行 Student 构造函数" << endl; } 此时 , 如果要创建 Student 对象 , 只能调用上述 有参构造函数 , 如果使用 Student s2 方式调用 默认构造函数 创建...Student 对象 , 就会报错 ; 如下带参数构造函数 , 并且为其 有参构造函数 参数 设置一个默认值 , 此时就可以使用 类名 对象方式定义对象变量 ; class Student...+ s2.age; s.height = this->height + s2.height; // 注意 : 返回是一个匿名对象 return s; } 如果返回新对象 , 而是将...创建 Student 实例对象 Student s(18, 180); // 打印对象情况 s.print(); // 调用有参构造函数 , 有参构造函数参数使用默认值 Student s2

    22320

    【C++】运算符重载 ⑨ ( 等号 = 运算符重载 | 调用默认浅拷贝构造函数情况分析 | 等号 = 运算符重载 与 拷贝构造函数 各自使用场景 | 等号 = 操作符重载步骤 )

    , 并支持链式操作 ; 一、等号 = 运算符重载 ---- 1、调用默认浅拷贝构造函数情况分析 C++ 编译器 为 类 提供 默认 拷贝操作 , 是对 成员变量 简单拷贝 , 是 浅拷贝 ;...在 【C++】深拷贝和浅拷贝 ③ ( 浅拷贝内存分析 ) 博客中 , 对浅拷贝进行了分析 , 使用 类对象 为 另一个对象 初始化时 , 会自动调用 拷贝构造函数 ; // 调用有参构造函数 , 创建...Student 实例对象 Student s(18, "Tom"); // 声明 Student 对象 s2 , 并使用 s 为 s2 赋值 // 该操作会调用 默认拷贝构造函数 //...拷贝构造函数 各自使用场景 等号 = 运算符重载 与 拷贝构造函数 各自使用场景 : 拷贝构造函数 : 如果 使用对象 为一个 新对象 进行初始化 , 调用是拷贝构造函数 ; 等号 = 运算符重载 :...(); // 声明 Student 对象 s2 , 并使用 s 为 s2 赋值 // 该操作会调用 默认拷贝构造函数 // C++ 编译器提供拷贝构造函数 只能进行浅拷贝 Student

    24620

    成员函数总结

    3、默认生成构造函数,到底有什么用? 处理自定义(回去调用这个成员默认构造函数),但对于内置类型不确定(看编译器),建议处理。...比如上面是自定义类型,就会自己调用Stack默认构造函数 默认构造函数概念: 我们写显示构造函数,编译器默认生成构造函数,叫默认构造 无参构造函数也可以叫默认构造 全缺省也可以叫默认构造 小总结...) 可以传参数就调用构造,都可以叫默认构造,这三个函数不能同时存在,只能存在一个 再谈构造函数(初始化列表) 先记一下格式,冒号开始,逗号分割。...我们如果写析构函数,那系统自动默认生成析构函数,不会把开辟指针处理 默认生成析构函数,行为跟构造类似,内置类型成员不做处理,自定义类型成员会去调用析构 三、拷贝构造函数 概念: 我们在创建对象时...调用顺序就是如果传值传参,会调用拷贝构造,然后再调用func函数 解决方法: 下面是栈拷贝构造函数(深拷贝) 深拷贝:本质拷贝指向资源,让跟你有一样资源,一样值!

    6010

    调用Thread类方法:public final String getName() 为什么得到线程对象名称默认是:Thread-0、Thread-1、Thread-2、...呢?

    调用Thread类方法:public final String getName() 为什么得到线程对象名称默认是:Thread-0、Thread-1、Thread-2、...呢?...main(String[] args) { 10 // 创建线程对象 11 // 无参构造 12 MyThread my1 = new MyThread...(); } } 由以上可知,由MyThread my1 = new MyThread(); 第一次调用无参构造时候,就会去父类thread 调用位无参构造,而父类无参构造是一系列init...同理,MyThread my2 = new MyThread(); 第二次调用无参构造时候,就会去父类thread 调用位无参构造,而父类无参构造是一系列init() 方法,最终得到 Thread...-1,启动线程后,再通过Thread类getName()方法得到线程对象名称。

    78920

    类和对象竟是这样(下集)

    一.初始化列表 其实大家可能会问,诶前面不是讲了有构造函数这个东西吗?为什么又要搞一个初始化列表出来。...其实根据其名字可以知道初始化列表是用来初始化,在构造函数中,其实并不能算是初始化,只能算赋值,因为构造函数可以多次调用,而初始化只能一次。...3.explicit关键字 构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认构造函数,还具有类型转换作用。 而加上explicit修饰后,就不能类型转换了。...静态成员为所有类对象所共享,不属于某个具体对象,存放在静态区 (2). 静态成员变量必须在类外定义,定义时添加static关键字,类中只是声明 (3)....静态成员也是类成员,受public、protected、private 访问限定符限制 (6).静态成员函数不可以调用非静态成员函数,非静态成员函数可以调用静态成员函数 三.友元 五.匿名对象

    8110

    openFoam源码中C++

    ,但声明变量是需要用到该模板类型,这时候就要用到模板类前置声明 可以看到操作符重载参数列表里用到了Field,这就必须进行前置声明,可能此时大家又有疑问,为什么操作符重载也要进行前置声明呢...有这样一条规定:友元函数和运算符前向声明:如果一个模板类里调用了友元函数(外面定义方法可以使用该类里面的私有变量),而且这个友元函数里面的参数还用到了这个模板类,那么就得提前以模板方式去声明这个类和函数...这里explict解释总结如下: C++中explicit关键字只能用于修饰只有一个参数构造函数, 它作用是表明该构造函数是显示, 而非隐式, 跟它相对应 另一个关键字是implicit..., 意思是隐藏,类构造函数默认情况下即声明为 implicit(隐式).explicit声明之后,外面调用构造函数必须显式声明, 因为构造器若只有一个参数并且默认是implicit,在外面调用时候可以直接等于...: 如果类设计者写复制构造函数, 编译器就会自动生成复制构造函数

    93130

    构造函数浅析

    声明默认(缺省)构造函数, 也同时声明了带默认参数构造函数.错误.因为存在暧昧构造函数调用....不带任何参数构造函数称为默认(缺省)构造函数.如果违背了规则中第三条,将会引起编译错误.必须声明为public型.(思考:为什么?)....规则四:调用顺序规则: 1. 在创建一个对象时自动地调用一个构造函数. 2. 在创建一个派生类对象时,首先执行基类构造函数,然后执行派生类成员对象构造函数,最后才执行派生类构造函数....规则五:定义对象规则: 只有当没有声明构造函数或者声明了缺省构造函数时,或者声明了带默认参数构造函数时,我们才能不指定实参来定义类对象....X a(); // 编译错误 被编译器解释为定义了一个没有参数,返回一个X类型对象函数.用缺省构造函数初始化类对象正确声明是去掉括号.而不是调用缺省构造函数. 规则六:拷贝构造函数: 1.

    79030

    C++之类和对象

    构造函数可以重载也支持缺省参数 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参默认构造函数,但一旦用户显式定义编译器将不再自动生成; 构造函数对内置类型处理,对自定义类型调用自定义类型自身默认构造...可以看到,我们写编译器确实会有一个构造函数来初始化,不过这个初始化出来数太随机值了,看起来就像乱码一样。这是为什么?...而C++引入了析构函数作为默认成员函数,它会在程序结束时由编译器自动调用完成资源释放(与构造函数并不是开辟空间类似,析构函数并不是销毁对象,销毁对象是由编译器来进行),与构造函数正好相反。...析构函数不能重载) 4.对象生命周期结束时,C++编译系统系统自动调用析构函数; 5.析构函数对内置类型处理,对自定义类型调用它自身析构函数 可以看到,虽然没有调用析构函数,但是编译器在...2.如果显示写了初始化列表,那么编译器就会调用显示写;否则对于内置类型编译器会使用随机值来初始化,对于自定义类型的话编译器就会去调用默认构造函数,如果没有默认构造函数编译器就会报错: 可以看到对于内置类型

    1.2K00

    C++(六个默认成员函数

    Date d2(2015, 1, 1); // 调用带参构造函数 // 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明 //...以下代码函数声明了d3函数,该函数无参,返回一个日期类型对象 // warning C4930: “Date d3(void)”: 未调用原型函数(是否是有意用变量定义?)...注意:在C++中,定义了构造函数会自动调用,但是在实际中vs是不会调用构造函数,所以C++11打了一个补丁就是可以在声明成员时候可以增加一个缺省值,在编译过程中,就会根据成员变量缺省值来对对象进行初始化...特征: 拷贝构造函数构造函数一种重载形式。 拷贝构造函数参数只有一个就是传递引用,如果进行传值调用的话就会产生无穷递归,编译器会报错。 对于第二点,为什么会产生无穷递归呢?...了解上面之后,接下来我们就来讨论为什么传值传参会产生无穷递归,首先我们传值的话会调用拷贝构造函数调用拷贝构造函数的话,因为调用拷贝构造函数参数也是一个自定义类型,所以又会继续调用拷贝构造函数,接着就会一直进行递归调用

    9810

    js 中构造函数构造函数作用,构造函数和普通函数区别

    大家好,又见面了,是你们朋友全栈君。...2、如果直接调用函数,那么,this对象指向window,并且,不会默认返回任何对象(除非显性声明返回值)。...4、构造函数返回值 构造函数执行过程最后一步是默认返回 this 。言外之意,构造函数返回值还有其它情况。 没有手动添加返回值,默认返回 this。...所以,虽然封装构造函数过程会比较麻烦,但一旦封装成功,我们再创建对象就会变得非常轻松,这也是我们为什么要使用构造函数原因。...逐个执行函数代码 D、将新建对象作为返回值 6、构造函数返回值默认是this 也有其他情况 。

    3.5K10
    领券