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

为什么不能在派生类的构造函数初始化列表中初始化基类的数据成员?

首先,派生类的构造函数初始化列表中初始化基类的数据成员是可行的,但可能会导致一些问题。

在初始化派生类对象时,如果我们在初始化列表中初始化基类的数据成员,那么这些基类数据成员将在派生类对象的生命周期内一直保持其初始值,无论派生类对象是否被使用或改变。这可能会导致一些意外的结果,例如数据成员值的错误、不一致或未定义行为等。

另一方面,如果我们不在派生类的构造函数初始化列表中初始化基类的数据成员,那么这些基类数据成员将在派生类对象的生命周期内保持其默认值或零值,这可能会导致派生类对象的行为不正确或不可预测。

因此,在派生类的构造函数初始化列表中初始化基类的数据成员是一个好的实践,但需要谨慎使用,以确保不会导致意外的结果。为了安全起见,我们通常应该在派生类的构造函数初始化列表中初始化基类的所有数据成员,除非有特殊的原因不能这样做,例如需要基类的默认值或其他特殊的行为。

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

相关·内容

【C++】构造函数初始化列表 ③ ( 构造函数 初始化列表 为 const 成员变量初始化 )

构造函数初始化列表 总结 : 初始化列表 可以 为 成员变量 提供初始值 ; 初始化列表 可以 调用 成员变量 类型 构造函数 进行成员变量初始化操作 ; 初始化列表 可以 使用 构造函数...传入 参数 ; 初始化时 , 根据定义顺序 , 先调用 成员变量 构造函数 , 然后调用外部类构造函数 , 析构函数正好相反 ; 实例对象 const 成员变量 必须只能在 初始化列表 中进行...初始化 , 所有的构造函数都要进行初始化操作 ; 一、构造函数 初始化列表 为 const 成员变量初始化 1、初始化 const 常量成员 如果 定义了 被 const 修饰 成员变量...进行赋值 , 因此 这里 必须在 构造函数 初始化列表 对 const 成员变量 进行赋值 ; 2、错误代码示例 - 没有初始化常量成员 在下面的 B , 定义了常量 const int..., 对 常量成员 进行初始化操作 ; 3、正确代码示例 - 在初始化列表初始化常量成员 在下面的 B , 所有的 构造函数 , 都要使用 初始化列表 初始化 常量成员 , 只要遗漏一个构造函数

21830

【C++】构造函数初始化列表 ① ( 对象作为成员变量时构造函数问题 | 构造函数初始化列表语法规则 )

一、对象作为成员变量时构造函数问题 1、问题描述 如果 一个 A 对象 作为 另外一个 B 成员变量时 , 在以下场景会报错 : 为 A 定义 有参 构造函数 , 那么 A 无参默认构造函数就失效了...; 此时使用 默认无参构造函数 初始化 B , 就会报错 ; 在一个 , 其成员变量是 带有参构造函数 类型 , 这种情况下没有调用 有参构造函数机会 , 此时就会出现 编译报错情况 ; 在下面的代码...是一种用于初始化成员变量方法 ; 构造函数初始化列表 可实现功能 : 为成员变量提供初始值 调用其他 成员变量 构造函数初始化成员变量 构造函数初始化列表语法规则 : 构造函数() : 成员变量名称...(成员变量值) , 成员变量名称(成员变量值) { // 构造函数内容 } 构造函数初始化列表 位置在 构造函数 参数列表之后 , 冒号 : 与花括号 {} 之间 ; 使用 逗号 , 分隔 ;...初始化列表元素由 成员变量名称 和 初始值组成 , 使用等号 = 连接 ; 在下面的代码 , 为 B 定义了默认构造函数 , 其中定义了 构造函数 初始化列表 ; 在 初始化列表 , m_age

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

    一、构造函数初始化列表 传递参数 1、构造函数参数传递 构造函数 初始化列表 还可以使用 构造函数 参数 ; 借助 构造函数 参数列表 , 可以为 初始化列表 传递参数 ; 在下面的代码..., A 定义了 2 个参数 有参构造函数 ; B 定义了 无参构造函数 , 但是在该 无参构造函数 , 定义了函数列表 B() : m_age(10), m_a(10, 150) , 在该函数列表..., 执行了 A 构造函数 ; B 还定义了 有参构造函数 , 接收 3 个参数 , 分别作为 m_age 成员值 , 和 A 类型成员对象 有参构造函数 2 个参数 , 这是 使用了.../ 析构函数 执行顺序 ---- 1、构造函数 / 析构函数 执行顺序 B 定义了 A 类型 成员变量 ; A 类型对象 是 被组合对象 ; 构造函数执行顺序 : 在 初始化 B 类型 实例对象时..., 先执行 被组合对象 A 构造函数 , 如果 被组合对象 有多个 , 则 按照 成员变量 定义顺序 进行初始化 ; 注意 : 此处 不是按照 初始化列表 顺序 进行初始化 ; 析构函数执行顺序

    24430

    【Kotlin】初始化 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数定义成员属性 | 次构造函数 | 构造函数默认参数 )

    文章目录 一、主构造函数定义临时变量 二、主构造函数定义成员属性 三、次构造函数 四、构造函数默认参数 一、主构造函数定义临时变量 ---- 在 Kotlin , 可以在 声明 时 在 名后...定义 " 主构造函数 " ; 在 主构造函数 , 可以 定义 成员属性 , 并为 成员属性 提供 初始值 ; 在 主构造函数 , 可以定义 临时变量 , 临时变量 一般使用 以下划线为开头 名称...---- 在主构造函数 定义临时变量 , 格式为 : class 名(_临时变量名: 临时变量类型){} 在主构造函数也可以 定义成员属性 , 格式为 : class 名(var 成员属性名:...成员属性类型){} 代码示例 : class Hello( // 主构造函数, 直接在主构造函数定义属性 var name: String, var age: Int ){}..., 每个次构造函数都可以有不同参数组合 ; 定义次构造函数后 , 必须调用主构造函数 , 并且为每个主构造函数 参数设置 参数值 ; 次构造函数可以实现代码逻辑 , 作为主构造函数补充 ; 代码示例

    4.8K20

    c++数据成员初始化次序

    分享一个之前学知识点,感觉还挺重要,就是当一个某个数据成员同时拥有就地初始化构造函数初始化列表构造函数函数体里赋值,那么它会先执行哪个?最后生效又是哪个呢?...根据老师讲解,数据成员初始化次序依次为: 就地初始化 > 构造函数初始化列表 >构造函数赋值(严格意义上不能成为初始化) 而当三种初始化方式都有时,构造函数体里赋值肯定执行,并且生效...,但是就地初始化构造函数初始化列表执行情况是怎样呢?...所以当一个数据成员同时拥有就地初始化初始化列表时,它会忽略就地初始化而执行构造函数初始化列表。...如果到代码有参构造函数函数体中加上 this->id = 20; ,运行结果会变为: 0 n = 1,id = 1 n = 1,id = 20 可以看到赋值把初始化列表给id初始化值覆盖掉了

    84520

    Dart 定义、构造函数、私有属性和方法、set与get、初始化列表

    Dart是一门使用和单继承面向对象语言,所有的对象都是实例,并且所有的都是Object子类。 1. Dart定义 ? 2. Dart构造函数 ? 3....Dart命名构造函数 ? 4. Dart中将抽离成一个单独模块 首先将模块写到一个单独文件,如下图所示为public文件夹下Person.dart为一个单独。 ?...在文件引入public下Person.dart文件,然后实例化。 ? 5....需要注意是,定义为私有属性和私有方法必须要抽离放在一个单独文件,然后才能真正起到私有的效果。 首先将含有私有属性或私有方法放在一个单独模块。 ?...在文件引入含有私有属性和私有方法。 ? 6. Dartget与set修饰符 ? 7. Dart初始化列表 Dart可以在构造函数体运行之前初始化实例变量。 ?

    6.2K40

    202453学习笔记:派生类默认成员函数

    6个默认成员函数,“默认”意思就是指我们写,编译器会变我们自动生成一个,那么在派生类 ,这几个成员函数是如何生成呢?...要明确是,继承关系里,先有父派生类才能去继承,所以派生类构造函数必须要遵守先父后子原则,必须调用构造函数初始化那一部分成员。...如果没有默认构造函数,则必须在派生类构造函数初始化列表阶段显示调用。 2.拷贝构造 派生类拷贝构造函数必须调用拷贝构造完成拷贝初始化。...和构造函数原则一样,如果没有默认拷贝构造函数,则必须在派生类构造函数初始化列表阶段显示调用。...四.总结 构造函数规则一般都于析构函数相反,.派生类对象初始化先调用构造再调派生类构造派生类对象析构清理先调用派生类析构再调析构。

    8910

    构造与析构时候...

    关于虚函数部分不在这篇再提,上一篇提过了。 文章目录 什么时候会调用默认构造函数 什么时候调用拷贝构造函数? 什么时候调用赋值运算符? 深拷贝与浅拷贝 成员初始化列表概念,为什么用它会快一些?...有哪些情况必须用到成员列表初始化构造/析构函数执行顺序 继承机制对象之间如何转换? C++成员访问权限和继承权限问题 如何禁止程序自动生成拷贝构造函数?...---- 成员初始化列表概念,为什么用它会快一些? 在构造函数,不在函数体内对成员变量赋值,而是在构造函数花括号前面使用冒号和初始化列表赋值。...用初始化列表会快一些原因是,对于类型,它少了一次调用构造函数过程,而在函数赋值则会多一次调用。而对于内置数据类型则没有差别。...1、初始化一个const成员 2、调用构造函数传参 3、初始化不存在默认构造函数别的对象 ---- 构造/析构函数执行顺序 构造时候:如果,先调用构造函数,再调用自己构造函数

    63920

    C++-带你初步走进继承(1)

    4.派生类默认成员函数 6 个默认成员函数, “ 默认 ” 意思就是指我们写,编译器会变我们自动生成一个,那么在派生类 ,这几个成员函数是如何生成呢? 1....派生类构造函数必须调用构造函数初始化那一部分成员。如果没有默认 构造函数,则必须在派生类构造函数初始化列表阶段显示调用。 2....派生类拷贝构造函数必须调用拷贝构造完成拷贝初始化。 3. 派生类 operator= 必须要调用 operator= 完成复制。 4....s时,调用了父构造和析构函数,这就说明了当派生类进行实例化时,会调用构造函数构造派生类成员。  ...当我自己写了一个Student构造函数,那么怎么初始化成员呢?可以在初始化列表调用构造函数,然后我们可以看到,是先调用了构造函数,再构造派生类成员

    13410

    《C++Primer》第十五章 面向对象程序设计

    如果想使用其他构造函数,我们需要以名加圆括号内实参列表形式为构造函数提供初始值。这些实参用于帮助编译器到底应该选择哪个构造函数初始化派生类对象部分。...虚函数与作用域 从名字查找先于类型检查我们可以得知为什么派生类函数为什么必须有相同形参列表了。...using声明语句指定一个名字而指定形参列表,所以一条成员函数using声明可以把该函数所有重载实例添加到派生类作用域中。...派生类拷贝控制成员 派生类构造函数在其初始化阶段不但要初始化派生类自己成员,还要负责初始化派生类对象部分。...如果含有几个构造函数,则除了两个例外情况外大多数派生类会继承所有的构造函数: 如果派生类定义构造函数构造函数有相同参数列表,则该构造函数不会被继承,定义在派生类构造函数会替换继承而来构造函数

    1.2K20

    C++继承

    private成员派生类无论以什么方式继承都是不可见。这里不可见是指私 有成员还是被继承到了派生类对象,但是语法上限制派生类对象不管在里面还是外面都不能去访问它。 2....(返回值和参数可以不相同) 四、派生类默认成员函数 1、默认构造函数 派生类成员:内置类型和自定义类型分别处理 成员:调用父构造函数 如果没有默认构造函数,则必须在派生类构造函数初始化列表阶段显示调用...注意子类不能帮父初始化,父只能调用自己构造函数,不能让子类去“帮忙” 注意构造函数调用顺序是先父后子,因为初始化列表初始化顺序跟出现顺序无关,跟声明顺序有关 2、析构函数 子类析构函数和父析构函数构成隐藏关系...为了保证先调用子类析构函数,父亲析构会在子类析构后自动调用。 构造:先父后子 析构:先子后父 为什么析构函数是先子后父呢?...菱形继承问题:从下面的对象成员模型构造,可以看出菱形继承有数据冗余和二义性问题。在Assistant对象Person成员会有两份。 虚拟继承可以解决菱形继承二义性和数据冗余问题。

    6810

    C++设计注意事项

    构造函数 如果没有声明构造函数,编译器会定义一个默认构造函数(无参数、无内容),让你可以初始化来直接创建对象: Star rigel; Star pleiades[6]; 但如果定义了某种形式构造函数...构造函数用来创建新对象,它是不能被派生类继承派生类需要定义自己构造函数,并在初始化列表调用构造函数: SubClass::SubClass(int a, int b):BaseClass(...b) { // 派生类初始化部分 } 注意,初始化列表能在构造函数上使用。...在定义派生类赋值操作符重载函数时,要显式地在函数通过::来调用赋值操作符,来操作成员,毕竟派生类很多时候无法直接访问到成员,只能通过调用公开方法来访问,而且也不能通过初始化列表方式来调用...析构函数最好定义成虚函数(virtual),这样当释放一个指针指向派生类时,也会自动先调用派生类析构函数,然后才调用析构函数,否则会只调用析构函数,这样派生类用new初始化成员将得不到释放

    39220

    C++11继承构造函数

    1.简介 子类为完成初始化,在C++11之前,需要在初始化列表调用构造函数,从而完成构造函数传递。如果拥有多个构造函数,那么子类也需要实现多个与构造函数对应构造函数。...; 上面代码,我们通过using Base::Base把构造函数继承到派生类,不再需要书写多个派生类构造函数来完成初始化。...这样比通过派生类构造函数“透传构造函数参数”来完成初始化方案,总是需要定义派生类各种构造函数更加节省目标代码空间。 2.注意事项 (1)继承构造函数无法初始化派生类数据成员。...继承构造函数功能是初始化,对于派生类数据成员初始化则无能为力。...此外,使用继承构造函数时,还需要注意以下几点: (1)如果构造函数被申明为私有成员函数,或者派生类是从虚继承 ,那么就不能在派生类申明继承构造函数; (2)一旦使用继承构造函数,编译器就不会再为派生类生成默认构造函数

    1.9K20

    C++关键知识点梳理

    ,未初始化变量含有一个不确定值,所以在定义变量时最好初始化成员使用初始化列表构造函数初始化均是良好编程习惯;变量定义和声明:变量可以在多个文件声明(external int i),但是只能在一个文件中被定义...初始化列表常量和引用成员必须在初始化列表初始化,因为这两成员不支持赋值操作,对象通过初始化列表初始化避免调用对象默认构造函数进行初始化,因此效率更高。...,构造函数初始化非static数据成员,析构函数销毁非static数据成员,而且数据成员销毁顺序和在构造函数初始化顺序相反。...protected继承方式所有 public 成员派生类为 protected 属性;所有 protected 成员派生类为 protected 属性;所有 private...private继承方式所有 public 成员派生类均为 private 属性;所有 protected 成员派生类均为 private 属性;所有 private 成员派生类不能使用

    96930

    【C++深度探索】继承机制详解(一)

    在公有继承公有成员和保护成员都可以在派生类访问,私有成员能在派生类中直接访问。...派生类构造函数必须调用默认构造函数初始化那一部分成员。...如果没有默认构造函数,则必须在派生类构造函数初始化列表阶段显示调用构造函数。...例如: 当我们将默认构造函数缺省值"tutu",去掉,它就不再是默认构造函数,那么在创建子类Student对象时就不会自动调用默认构造函数,会保错,那么这时我们就需要在初始化列表里显示调用...这是因为规定在初始化列表是不可以使用父成员 ✨拷贝构造 派生类拷贝构造函数必须调用拷贝构造完成拷贝初始化

    7810

    【C++】继承

    实际运用,公有继承最为常见,私有继承和保护继承并不常见,因为你继承目的就是想让子类能够访问到某些成员,并且保护继承下来成员能在派生类中进行使用,派生类外都无法访问到公有成员函数,所以实际扩展维护性不强...派生类构造函数只能调用构造函数初始化那部分成员,不能在自己构造函数里面初始化成员,值得注意是,如果有默认构造函数,那我们不需要管成员初始化工作,只要把派生类自己成员构造函数里面初始化即可...但如果没有合适默认构造,那则必须在派生类初始化列表显示调用有参构造函数进行成员初始化。 2....拷贝构造函数构造不同,必须在派生类拷贝构造初始化列表处显示调用拷贝构造,完成成员复制。在传参时有人可能会有疑问,调用拷贝构造该如何将子类成员提取出来呢?...//如果父没有合适默认构造,则必须在子类调用有参构造完成成员初始化

    69910

    C++进阶:继承

    派生类默认成员函数 构造函数 由于我们是先继承成员,所以我们实例化时候,也是先定义成员,所以在初始化时候我们也是先初始化成员变量 可以看到这里先初始化成员...,即便我将构造函数写在初始化列表后面,根据这个也可以断定成员变量是在派生类原本成员变量之前定义,因为初始化列表初始化顺序是和声明顺序一致,这说明在派生类中继承成员是先声明..._b) ,A(b) {} private: int _b; }; 对于拷贝构造来说这里就要用到刚刚我们刚刚讲到切片,也就是赋值兼容转换,如果是派生类成员变量的话,就直接走初始化列表直接进行初始化...析构函数 对于析构函数来说,首先我们要知道是,在我们调用构造函数时候,先初始化成员,所以应该是成员初始化,然后再初始化派生类自身成员,所以这里应该是成员先入栈,派生类再入栈,...我们还讨论了继承作用域问题以及派生类默认成员函数,包括构造函数、拷贝构造函数、赋值拷贝函数和析构函数。 特别地,我们重点分析了析构函数在多态性作用。

    10310

    硬核 | C++ 基础大全

    所以不能在声明初始化 const 数据成员,因为对象在没有创建时候,编译器不知道 const 数据成员值是什么。const 数据成员初始化能在构造函数初始化列表中进行。...(补充:静态非常量数据成员,其只能在外定义和初始化,在内仅是声明而已。)...当初始化一个引用成员变量时; 初始化一个 const 成员变量时; 当调用一个构造函数,而构造函数拥有一组参数时; 当调用一个成员构造函数,而他拥有一组参数; 编译器会一一操作初始化列表,以适当顺序在构造函数之内安插初始化操作...在派生类构造函数,所有的虚及上一层构造函数调用; 对象 vptr 被初始化; 如果有成员初始化列表,将在构造函数体内扩展开来,这必须在 vptr 被设定之后才做; 执行程序员所提供代码;...记录在成员初始化列表数据成员初始化操作会被放在构造函数函数体内,并与成员声明顺序为顺序; 如果一个成员并没有出现在成员初始化列表,但它有一个默认构造函数,那么默认构造函数必须被调用; 如果 class

    1.2K10

    【C++】继承

    派生类默认成员函数 在之前和对象学习,我们学过里面有6个默认成员函数 即我们写,编译器可以自动生成,那在派生类,这6个默认成员函数是如何生成呢?...我们发现这里我们自己初始化继承下来_name成员但是报错了。 为什么不行呢?那这里要告诉大家是: 派生类构造函数必须调用构造函数初始化那一部分成员。...那如果我们写了构造,但不去处理从父继承下来成员呢? 我们手动去调,在初始化列表还是会自动去调父默认构造。 那如果父没有默认构造呢?...如果没有默认构造函数,则必须在派生类构造函数初始化列表阶段显示调用。 那其实这里感觉就有点像子类里面有一个父自定义类型成员一样。...当然有的地方可能还是有差异,比如自定义类型成员如果没有默认构造,必须在初始列列表初始化(C++11之后可以给缺省值),但是父没有默认构造的话,就只能在初始化列表显示调父构造

    13610

    1小时深入c++面向对象编程

    2派生类定义延续 3派生类组合派生类将其自身与区别开来方法是添加数据成员成员函数 4.2.7 派生类构造函数调用顺序 构造函数>>子对象构造函数>>派生类构造函数体 4.2.8...) 当构造函数使用一个或多个参数时,派生类必须定义构造函数,提供将参数传递给构造函数途径(设数据成员为m个,派生类数据成员为n个,派生类参数个数为x,则:0≤x≤m+n) ?...,与派生类构造函数中所定义成员初始化列表各项顺序无关 4.2.11 示例 ?...图4-12 多继承构造函数调用顺序 4.3 二义性问题 原因:在多继承情况下,造成某个成员访问出现唯一情况 4.3.1 成员函数二义性 ?...虚子对象由最派生类构造函数通过调用虚构造函数进行初始化 在一个成员初始化列表中出现对虚和对非虚构造函数调用时,虚构造函数先于非虚构造函数执行 最派生类构造函数成员初始化列表必须给出对虚构造函数调用

    61820
    领券