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

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

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

67730

【Flutter】Dart 面向对象 ( 类定义 | 类的继承 | 私有变量 | 可选参数 | 默认参数 | 初始化列表 )

文章目录 一、 Dart 面向对象 二、 类定义 三、 类的继承 四、 私有变量 五、 可选参数与默认参数 六、 初始化列表 七、 完整代码示例 八、 相关资源 一、 Dart 面向对象 ---- OOP...基本特点 : 封装 : 将现实中存在的事务封装成类 ; 继承 : 使用现有类的功能 , 无需重写现有类的变量及方法 , 只实现扩展内容 ; 多态 : 子类对象可以赋值给父类类型变量 ; 类中定义的内容...---- 使用 extends 关键字定义子类 , 注意如果父类有非空参数的构造函数, 子类必须实现相同参数的构造函数 ; // 继承 class Student extends Person{ Student...// 如果父类有非空参数的构造函数, 子类必须实现相同参数的构造函数 // 如果该类有父类 , 那么先调用父类的构造方法 , 完成父类的初始化 // 然后才能完成自己的初始化 // this.school...---- 初始化列表 : 冒号后面的内容就是初始化列表 , 父类构造器也是初始化列表 , 除了父类构造方法之外 , 还可以在子类构造方法体之前初始化示例变量 , 不同的初始化实例变量之间使用逗号隔开

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

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

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

    26130

    【C++】继承 ⑥ ( 继承中的构造函数和析构函数 | 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

    地方 , 都可以使用 " 公有继承 " 的 派生类 ( 子类 ) 对象 替代 , 该 派生类 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外的 所有 成员变量 和 成员方法 ; 功能完整性 :..." 应用场景 : 直接使用 : 使用 子类对象 作为 父类对象 使用 ; 赋值 : 将 子类对象 赋值给 父类对象 ; 初始化 : 使用 子类对象 为 父类对象 初始化 ; 指针 : 父类指针 指向...指向 子类对象 定义 一个子类对象 Child child ; 定义父类的指针 , 将 指针 指向 子类对象 的地址 , 这是合法的 ; 代码示例 : // 父类对象 Parent parent...); } 2、使用 子类对象 为 父类对象 进行初始化 定义父类对象 , 可以直接使用 子类对象 进行初始化操作 ; // II....类型兼容性原则 : 使用 子类对象 为 父类对象 进行初始化 Parent parent = child; 3、完整代码示例 #include "iostream" using namespace

    30920

    C语言结构体类型定义+结构体变量的定义与使用及其初始化+结构体变量作为函数参数

    上一篇文章:返回指针值的函数+指向函数的指针+main()函数的参数 C语言结构体类型定义+结构体变量的定义与使用及其初始化+结构体变量作为函数参数 结构体 引例 结构体变量的定义 结构体变量的使用...结构体变量作为函数参数 结构体变量的初始化 下一篇文章 结构体 引例 输出平均分最高的学生信息 #include struct student { int num; char name...int main() { struct date year; year.year = 1980; } 1234567891011 结构体变量的使用 使用形式为:结构体变量.结构体成员名...,不能直接用“=”,即s1.name="张三";是错误的,必须使用字符串复制函数strcpy()函数来实现,如:strcpy(s1.name,"张三"); 同一类型的结构体变量间可以赋值 如:...stu2=stu1;将结构体变量stu1里面的所有成员变量的值分别对应赋给结构体变量stu2 结构体变量作为函数参数 结构体变量的成员作为函数的实参,形参为普通变量或数组 也可以将结构体变量作为函数的参数

    2.4K20

    C++初阶-类和对象下

    ,但是不能将其称作为类对象成员的初始化构造函数体中的语句只能将其称作为赋初值,而不能称作初始化。...,其引用变量和const变量成员必须在初始化列表进行初始化 示例: class A { public: A(int a,int b)//是构造函数,但不是默认构造函数,不会在没有参数的时候进行调用...,一步步走一遍代码,能够看到构造函数是先走完初始化列表,再走函数体赋值 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关 示例: class A { public...构造函数不仅可以构造与初始化对象,对于单个参数的构造函数,还具有类型转换的作用,而对于使用explicit修饰的构造函数,则禁止了这样的转换构造对象 示例: class Date { public...this指针默认是第一个参数也就是左操作数了。但是实际使用中cout\cin需要是第一个形参对象,才能正常使用。所以我们要operator函数。

    37830

    【C++篇】深度解析类与对象(中)

    3.自动调用:对象创建时,系统自动调用构造函数初始化对象。 4.支持重载:可以根据不同参数列表定义多个构造函数。...,可以通过传递参数来指定对象的初始状态:Date d(2025, 5, 10); 全缺省构造函数:带有所有默认参数的构造函数,也可以作为无参构造函数使用。...2.4 初始化列表 什么是初始化列表? 初始化列表是构造函数的一种特殊语法,用于在对象创建时为其成员变量赋初值。它的语法是在构造函数的参数列表之后,冒号(:)后面跟随成员变量的初始化代码。...构造函数使用初始化列表将传入的参数 x 和 y 直接赋值给 _x 和 _y。 为什么要用初始化列表? 提高效率:初始化列表可以避免成员变量被先默认初始化再赋值,减少不必要的操作。...赋值运算符重载的实现示例 #include // 为了使用memcpy函数 class Stack { public: // 构造函数,初始化栈,默认容量为4 Stack

    12410

    类和对象(万字总结!深度总结了类的相关知识)(中)

    类的6个默认构造函数 C++ 编译器会为每个类自动生成以下6个默认成员函数(除非显式定义)。如果用户没有定义这些函数,编译器会生成默认实现: 2....命名:构造函数的名字与类名相同(在C++中),没有返回类型(即使是void也没有)。 重载:构造函数可以被重载,即可以定义多个构造函数,参数列表不同以实现不同的初始化方法。...默认构造函数:如果不显式定义构造函数,编译器会提供一个默认的无参构造函数。 初始化列表:在C++中,构造函数可以通过初始化列表直接初始化成员,效率更高。...2.2 构造函数的类型: 默认构造函数: 无参数构造函数,用于对象的默认初始化。 如果类没有用户定义的构造函数,编译器会生成一个默认构造函数。...: 构造函数的初始化列表可以用于高效地初始化成员变量,特别是当成员是类类型或常量时。

    9810

    【C++】C++11风云再起:语法新纪元,性能新巅峰!

    适用于较小规模的初始化列表,因为它的实现通常会生成临时数组,存在一定的性能开销。...统一初始化语法,增强灵活性 使用场景 函数参数 任意对象的初始化 实现机制 内部通过临时数组存储 直接调用构造函数 修改性 不可修改 支持修改 2.可变模板参数 可变参数模板是C++11引入的一种强大的模板功能...这些函数可以在需要函数对象的地方作为参数传递,通常用于算法或函数式编程风格。...(类似于仿函数),这个类实现了 operator()(函数调用运算符),因此它行为类似于函数对象。...Lambda 的函数体会转化为 operator() 方法的实现。 实例化类对象 Lambda表达式 在使用时,会生成这个类的一个对象。

    5810

    C++新旅程:类的拷贝构造函数 、赋值运算符重载 和const成员函数

    1.2特征(1)拷贝构造函数是构造函数的一个重载形式(2)参数有且只有一个,必是类类型对象的引用,使用传值编译器会直接报错(因为会引发无穷递归调用1.3拷贝构造函数典型调用场景使用已存在对象创建新对象函数参数类型为类类型对象函数返回值类型为类类型对象简单代码示例一...C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。...2.0运算符重载函数(1)函数名:operator+需要重载的运算符符号(2)函数原型:返回值类型 operator+符号(形参参数列表)(3)必须有一个类类型的参数(4)简单代码示例2.1概念赋值重载...:一个已经存在的对象,拷贝复制给另一个已经存在的对象(要区别拷贝构造)注意:1、作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this。...此时用户再在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是类的成员函数。

    8210

    C++11-列表初始化变量类型推导范围forfinal&override默认成员函数控制

    1、内置类型列表初始化 C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加 示例: int...{}之前使用等号,其效果与不使用=没有什么区别 2、自定义类型列表初始化 标准库支持单个对象的列表初始化 class Pointer { public: Pointer(int x = 0...//Pointer p( 1, 2 ); return 0; } 多个对象的列表初始化 多个对象想要支持列表初始化,需要实现initializer_list类型参数的构造函数...expression 是要遍历的对象,它可以是 表达式 、容器、数组、初始化列表 等 五、final和override 1、final C++ 中增加了 final 关键字来限制某个类不能被继承,...在C++中对于空类编译器会生成一些默认的成员函数,如果在类中显式定义了,编译器将不会重新生成默认版本 有时候这样的规则可能被忘记,最常见的是声明了带参数的构造函数,必要时则需要定义不带参数的版本以实例化无参的对象

    73860

    【c++】探究C++中的list:精彩的接口与仿真实现解密

    下面是这些函数的简要说明和使用示例: splice: 将元素从一个列表转移到另一个列表,可以转移整个列表、一个单独的元素或一个元素范围。...它接受一个比较函数作为参数(可选)。...还有一个构造函数,它接受一个 const T& 类型的参数,如果构造函数没有提供参数,则会使用 T 类型的默认构造函数来初始化 _data。...这里的列表初始化允许直接用花括号 {} 来初始化对象。C++11 引入的列表初始化特性可以用来初始化任何对象,包括具有构造函数的对象。...初始化时没有使用相应类型的构造函数,而是依赖编译器生成的代码来创建一个具有给定初始化列表的对象,并将其传递给 push_back 函数。

    13410

    【C++修行之道】类和对象(六)再谈构造函数(初始化列表)| explicit关键字 | static成员 | 友元|匿名对象|拷贝时一些编译器优化

    成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关 6.初始化列表,不管你写不写,每个成员对象都会先走一遍 1.4 explicit关键字 单参数构造 多参数构造.../ 自定义类型的成员会调用默认构造 // 内置类型有缺省值用缺省值,没有就看编译器,有的会处理,有的不会处理 // 先走初始化列表 + 再走函数体 // 实践中:尽可能使用初始化列表初始化,不方便再使用函数体初始化...它允许在需要类类型对象的地方使用构造函数的参数类型值,编译器会自动调用这个构造函数进行类型转换。 class A { public: // 1....这主要通过列表初始化来实现,即使用花括号{}来初始化对象。...这种对象通常用于临时存储数据或者作为函数参数传递。匿名对象的生命周期仅限于当前语句或表达式的作用域。

    14710

    C++初阶-类和对象中

    C++类和对象渐入之章 一、前言 二、类的6个默认成员函数汇总 三、构造函数 四、析构函数 五、拷贝构造函数 六、赋值运算符重载 1、运算符重载 2、赋值运算符重载 七、日期类的实现 八、const成员...,C++对此做出了优化,即在创建对象时自动调用初始化函数,也就是构造函数 概念: 构造函数是特殊的成员函数,在由类创建对象时对对象的成员变量进行初始化,创建类类型对象时由编译器自动调用,保证每个数据成员都有一个合适的初始值...特征: 拷贝构造函数是构造函数的一个重载形式(参数不同) 拷贝构造函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用(传值也是一种拷贝,会继续调用拷贝函数) 示例:...Date d2(d1); return 0; } 编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝了,对于像日期类这样的类(只有指针类型的类)是没必要的,编译器生成的足够使用了,而对于存在指针类型的成员函数则会存现问题...,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似 使用: 函数名字:关键字operator后面接需要重载的运算符符号 函数原型:返回值类型 operator操作符(参数列表) 注意:

    62120

    C++复习篇

    操作符重载实现:类型转换函数 20.explicit显式调用(用来阻止隐式转换) 21.父类和子类中的同名成员/函数 22.子类对象初始化父类对象 23.父类对象初始化子类对象 24.纯虚函数vertual...Test(const Test& t) {   //copy... ... } }; 10.构造函数初始化列表 当类中有const成员变量时,则必须要用初始化列表进行初始化....初始化列表位于构造函数名右侧,以一个冒号开始,接着便是需要初始化的变量,以逗号隔开 示例如下: class Example { private:   int i;   float j;   ...Child类为例,在编译器中,可以将子类对象退化为父类对象,从而实现子类来初始化父类,比如: Parent p1(Child()); //Child()构造函数会返回一个临时对象,从而通过子类初始化父类...Child c; Parent & p2 = c ; //定义p2是C对象的别名 23.父类对象初始化子类对象 只能使用static_cast或者C方式转换,以上示例的Parent类和Child

    1.3K20

    揭开lambda的神秘面纱

    ,即类对象作为参数): int main() { struct Compare { bool operator()(int a, int b) { return a 的语法开销,缺点是不能限定作用域(即必须在使用作用域外进行定义),而对于函数对象的实现方式来说,其优点是可以在作用域内进行定义,但缺点是需要有类定义的语法开销。...函数参数、返回类型和函数体在普通函数或者类成员函数中我们都有用到,那么什么是捕获列表和附加说明符呢?这就是本节的内容。...源码中的fun在编译器实现之后,变成了一个__lambda_8_14对象 对fun函数的调用,变成了调用__lambda_8_14对象的operator()函数 如果捕获列表内容为[=],则类的private...,对应lambda_xxxx类成员函数 operator() 的返回类型 lambda表达式中的函数体,对应lambda_xxxx类成员函数 operator() 的函数体 效率 作为cpp开发人员,

    75920

    与C++类和对象的宿命(下)

    再探构造函数 • 之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种⽅式,就是初始化列表,初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成员列表,每个"...,我们会在初始化的时候进行缺省值的调用操作的 以后得构造函数初始化成员尽量使用初始化列表 优先就是显示初始化 没有缺省值就是调用对应类型的默认构造函数 • 初始化列表中按照成员变量在类中声明顺序进⾏初始化...**封装辅助类**:当一个类需要多个小的辅助类来帮助实现某些功能时,这些辅助类可以被放在外部类的内部以表示逻辑上的从属关系。例如,迭代器类通常会作为容器类的内部类实现。 8....0; } 友元函数的使用场景: 运算符重载:有时候需要通过非成员函数实现运算符重载,而这些函数需要访问类的私有数据,此时友元函数非常有用。...以下是几个常见的场景: 方法参数:在传递对象作为方法参数时,直接创建匿名对象而不需要事先定义它。

    20410

    【C++ 类和对象 进阶篇】—— 逻辑森林的灵动精灵,舞动类与对象的奇幻圆舞曲

    它通常在以下几种情况下被调用: 对象作为函数参数传递时(按值传递) 从函数返回一个对象(返回值时) 初始化一个对象为另一个同类型对象的副本(拷贝初始化) 拷贝构造函数的特点: 拷贝构造函数是构造函数的⼀...拷贝构造函数的第⼀个参数必须是类类型对象的引用,使用传值方式编译器直接报错,因为语法逻辑上会引发无穷递归调用。...拷贝构造函数的使用场景: 按值传递参数时: 当对象作为函数参数传递,并且该对象以值的方式传递时,会调用拷贝构造函数。...operator符号:运算符的标识符,例如 +、-、*、[]、= 等。 参数列表:指定操作数的类型和数量。 重载运算符函数的参数个数和该运算符作用的运算对象数量⼀样多。...虽然我们可以直接使用 & 来获取对象的地址,但如果你需要在自定义类中对取地址运算符进行重载,则可以通过重载 operator& 来实现,通常情况下是返回当前对象的this指针。

    3800

    剖析【C++】——类和对象(下篇)——超详解——小白篇

    1.再谈构造函数 1.1 构造函数体赋值 构造函数是用来初始化对象的特殊函数。当我们创建一个对象时,编译器会自动调用构造函数来给对象的成员变量赋值。...总结:尽量使用初始化列表,因为它对自定义类型成员变量更高效。 1.3 explicit 关键字 构造函数不仅可以用来创建对象,还可以用来进行类型转换。...对于只有一个参数的构造函数,如果不使用 explicit 关键字,编译器会自动进行隐式类型转换。 简单理解:假设有一个银行系统,你有一个账户类。...初始化:静态成员变量必须在类外进行初始化。 面试题:实现一个类,计算程序中创建了多少个类对象。...3.1 友元函数 问题描述:在重载 operator函数,因为 cout 作为输出流对象和 this 指针会竞争第一个参数的位置。

    7510

    C++之类和对象

    拷贝构造也是特殊的成员函数,其特征如下: 1.拷贝构造函数是构造函数的一个重载形式,当我们使用拷贝构造实例化对象时,编译器不再调用构造函数; 2.拷贝构造函数的参数只有一个且必须是类类型对象的引用,...,可以理解为需要写析构函数就需要写拷贝构造,不需要写析构函数就不需要写拷贝构造; 拷贝构造的经典使用场景: 使用已存在对象创建新对象; 函数参数类型为类类型对象; 函数返回值类型为类类型对象;...浅拷贝,对自定义类型调用其自身的赋值重载函数; 日期类赋值重载的实现 赋值重载一般使用引用做参数(这里其实可以使用传值传参,但是传值传参要拷贝临时变量,所以为了提高效率还是使用引用做参数),并用const...,要牢记初始化只能有一次 2.如果我显示写了初始化列表,那么编译器就会调用我显示写的;否则对于内置类型编译器会使用随机值来初始化,对于自定义类型的话编译器就会去调用它的默认构造函数,如果没有默认构造函数编译器就会报错...: 可以看到对于内置类型_a当我不在初始化列表中初始化它,编译器就会用一个随机值来初始化,而我不在初始化列表中初始化,编译器就会自己去找自定义类型自己的默认构造函数,当自定义类型既没有在初始化列表中显示定义又没有默认构造函数时就会报错

    1.2K00
    领券