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

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

一、类对象作为成员变量时的构造函数问题 1、问题描述 如果 一个类 A 的对象 作为 另外一个类 B 的成员变量时 , 在以下场景会报错 : 为类 A 定义 有参的 构造函数 , 那么 A 的无参默认构造函数就失效了...; 此时使用 默认无参构造函数 初始化 B , 就会报错 ; 在一个类中 , 其成员变量是 带有参构造函数 的类型 , 这种情况下没有调用 有参构造函数的机会 , 此时就会出现 编译报错情况 ; 在下面的代码中...========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== 二、构造函数初始化列表 ---- 1、构造函数初始化列表语法规则 在 C++ 语言中 , 构造函数初始化列表...是一种用于初始化类的成员变量的方法 ; 构造函数初始化列表 可实现功能 : 为成员变量提供初始值 调用其他 成员变量的 构造函数 来初始化成员变量 构造函数初始化列表语法规则 : 构造函数() : 成员变量名称...初始化列表中的元素由 成员变量的名称 和 初始值组成 , 使用等号 = 连接 ; 在下面的代码中 , 为 B 类定义了默认的构造函数 , 其中定义了 构造函数 初始化列表 ; 在 初始化列表中 , m_age

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

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

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

    26230

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

    指定自有参数 // {this.school} 是可选参数, 可选参数必须在构造函数参数列表中最后一个 // 默认参数 : 可选参数中如果用户不初始化该可选参数 , 那么为其指定一个默认值...---- 初始化列表 : 冒号后面的内容就是初始化列表 , 父类构造器也是初始化列表 , 除了父类构造方法之外 , 还可以在子类构造方法体之前初始化示例变量 , 不同的初始化实例变量之间使用逗号隔开...; // 初始化列表 : 冒号后面的内容就是初始化列表 // 父类构造器也是初始化列表 // 除了父类构造方法之外 , 还可以在子类构造方法体之前初始化示例变量..., 完成父类的初始化 // 然后才能完成自己的初始化 // this.school 指定自有参数 // {this.school} 是可选参数, 可选参数必须在构造函数参数列表中最后一个...字符串值 // 初始化列表 : 冒号后面的内容就是初始化列表 // 父类构造器也是初始化列表 // 除了父类构造方法之外 , 还可以在子类构造方法体之前初始化示例变量

    2K00

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

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

    6.5K40

    用vue-cli初始化项目带编译器和不带编译器的区别

    通过上一篇文章Vue2 dist 目录下各个文件的区别,我们了解了vue安装包中dist文件中8个文件的作用,并且给大家留了一个小思考题,就是在用vue-cli初始化项目的时候,选择带编辑器和不带编辑器的区别...从字面意思就可以看出初始化项目过程中,选第一行的话生成的vue项目就是带编译器的,选第二句的话就是不带编译器的,同时它们都是选择的运行时版本。...前者遵循commonjs模块化规范,后者支持es6模块化规范,最新版本的vue-cli构建vue项目用的是webpack2,而webpack2支持以上两种规范,如果你用vue-cli初始化项目的时候选择第二行...那如果初始化过程中选择的是第一行呢,运行时带编译器。结果生成的vue项目中使用的是哪一个版本的vue呢? 回忆一下上一篇文章,支持运行时并且带编译器的是8个文件中的哪一个呢?...到此用vue-cli初始化项目带编译器和不带编译器的区别就为大家介绍完了。

    1.8K40

    【细品C++】类和对象的一些细节(初始化列表、友元、static成员等)

    因为初始化只能初始化一次(定义时),而构造函数体内可以多次赋值。 那么一个类对象真正的定义初始化是在什么时候的呢?就在接下来提到的初始化列表当中。...初始化列表 初始化列表使用格式:在构造函数函数名与函数体({})之间,以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个“成员变量”后面跟一个放在括号中的初始值或表达式。...事实上,初始化列表全称叫做构造函数初始化列表,也就是说初始化列表是构造函数的一部分,无论时显式还是隐式,成员变量总是需要初始化的,这是一个类对象创建必经的步骤。...当然,抛开这些不谈,无论是类成员,还是普通地使用内置类型变量,尽量对变量初始化是一个良好的编程习惯。 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表的先后次序无关。...static成员 概念 声明为**static的类成员称为类的静态成员**。用**static修饰的成员变量**,称之为静态成员变量,用**static修饰的成员函数**,称之为静态成员函数。

    47420

    【C++11特性篇】利用 { } 初始化(1)

    一.回顾C++98标准中{}的使用 在C++98中,标准允许使用花括号{ }对数组或者结构体元素进行统一的列表初始值设定。...,并且可以不写= C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型 (多参数构造函数隐式类型转换) 使用初始化列表时,可添加等号(=),也可不添加...{ 2 }; int z{ 3 }; int a1[] = { 1,2,3 }; int a2[] { 1,2,3 }; // 本质都是调用构造函数 point p0(0, 0);//初始化列表..."和"列表初始化" 初始化列表 :用于初始化实例化类的列表,一般以( )形式调用 列表初始化 :用 { } 调用 ,调用构造函数初始化 class Date { public: Date(int...// C++11支持的列表初始化,这里会调用构造函数初始化 Date d2{ 2022, 1, 2 }; Date d3 = { 2022, 1, 3 };

    10510

    呜呜呜我要拿Go赢他~ 入门,基础语法Type 、interface、struct、*指针接收器

    接口定义使用关键字 type 后跟接口名称、interface 和大括号括起的方法声明列表。...它们是由关键字 type 后跟类型名称和大括号括起的字段声明列表定义的。...结构体和指针之间的方法可以互相调用 设计不可变对象,用结构体接收器 总结:遇事不决用指针 结构体如何实现接口 当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。...当一个结构体具备接口的所有的方法的时候,它就实现了这个接口 实现看到自己定义的 不带* 的为结构体接收器 带 * 的为指针接收器 如何查看实现的接口 点击箭头会自动跳转 注释规范 可以看到 Golang...其中 type A=B 这种别名,一般只用于兼容性处理 • 先有抽象再有实现,所以要先定义接口 • 鸭子类型:一个结构体有某个接口的所有方法,它就实现了这个接口 • 指针:方法接收器,遇事不决用指针 最后

    25821

    C++11入门基础篇

    所以最终定名为C++11 统一的列表初始化 { }的初始化 C++98中,标准允许使用大括号{}对数组或者结构体元素进行统一的列表初始值设定。...; } C++11扩大了用大括号括起来的列表{初始化列表}的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号,也可不添加。...initializer_list本质就是一个大括号括起来的列表,如果用auto关键字定义一个变量来接收一个大括号括起来的列表,然后以typeid(变量名).name()的方式查看该变量的类型,此时会发现该变量的类型就是...使用迭代器方式遍历时,需要在迭代器类型前面加上typename关键字,指明这是一个类型名字。因为这个迭代器类型定义在一个类模板中,在该类模板未被实例化之前编译器是无法识别这个类型的。...最好也增加一个以initializer_list作为参数的赋值运算符重载函数,以支持直接用列表对容器对象进行赋值,但实际也可以不增加。

    9710

    【C++】C++11——简介|列表初始|简化声明|nullptr与范围for|STL中的变化

    { Point p1 = { 1,2 }; int array1[] = { 1,2,3,4,5 }; int array2[5] = { 0 }; return 0; } C++11扩大了用大括号括起的列表...函数: {}的本质就是initializer_list,如果我们使用auto来定义一个变量去接收一个大括号括起来的列表,然后用 typeid(变量名).name() 查看变量的类型,此时会发现该变量的类型就是...initializer_list 这个东西到底有什么用:C++98 不支持直接用列表对容器进行初始化,这种初始化方式是在C++11引入initializer_list后才支持的,而这些容器之所以支持使用列表进行初始化...因为array用一个类对数组做了封装,并且在访问array容器中的元素时会进行越界检查:用[]访问元素时采用断言,调用at成员函数访问元素时采用抛出异常检查。...所以我们一般还是使用list容器 C++11新的接口 C++11给容器都增加了一些新的接口: 最开始说的提供了一个以initializer_list作为参数的构造函数,用于支持列表初始化 比较鸡肋的接口

    21220

    CC++结构体完全攻略

    以下是一个结构体声明的示例,该结构体将 5 个变量绑定在一起,保存了员工的工资单数据。这个特殊结构体的名称是 PayRoll。请注意,它以大写字母开头,这和类名使用大写字母开头的约定一样。...另外还要注意,与类声明一样,在结构体声明的大括号后面必须有一个分号。...本示例中的结构体声明只是告诉编译器PayRoll结构体看起来的样子。它本质上是创建一个名为 PayRoll 的新数据类型。...初始化列表 初始化结构体变量成员的最简单的方法是使用初始化列表。初始化列表是用于初始化一组内存位置的值列表。列表中的项目用逗号分隔并用大括号括起来。...如果结构体包括任何诸如字符串之类的对象,那么在许多编译器上它都将无法运行。 在这些情况下,可以使用构造函数来初始化结构体成员变量,这和初始化类成员变量是相同的。

    99310

    【C++修炼之路】26.C++11(语法糖)

    二.统一的列表初始化 2.1 {}初始化 在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。...array1[] = { 1, 2, 3, 4, 5 }; int array2[5] = { 0 }; Point p = { 1, 2 }; return 0; } C++11扩大了用大括号括起的列表...(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加。...也可以作为operator=的参数,这样就可以用大括号赋值。因此我们就知道了为什么vector类的空间是如何初始化的,vector的构造函数就存在std::initializer_list的参数。...那再来回顾一下当初模拟实现的vector,由于我们并没有设置std::initializer_list的构造,因此采用大括号进行初始化是错误的,所以我们可以多重载一个由std::initializer_list

    44000

    代码块总结

    在编程过程中我们可能会遇到如下这种形式的程序: public class Test { { //// } } 这种形式的程序段我们将其称之为代码块,所谓代码块就是用大括号...({})将多行代码封装在一起,形成一个独立的数据体,用于实现特定的算法。...一般来说代码块是不能单独运行的,它必须要有运行主体。在Java中代码块主要分为四种: 一、普通代码块 普通代码块是我们用得最多的也是最普遍的,它就是在方法名后面用{}括起来的代码段。...修饰的用{}括起来的代码段,它的主要目的就是对静态属性进行初始化。...这是利用编译器会将构造代码块添加到每个构造函数中的特性。 2. 初始化实例环境 一个对象必须在适当的场景下才能存在,如果没有适当的场景,则就需要在创建对象时创建此场景。

    82340

    【C++11】{}初始化、std::initializer_list、decltype、STL新增容器

    统一的列表初始化 首先声明一下: 这个列表初始化和我们类和对象那里学的初始化列表不是一个概念,是不同的。...比如: 那我们C语言里面其实就是这样搞的嘛,所以可以认为C++支持这样就是因为要兼容C嘛 那么在C++11中: C++11扩大了用大括号括起的列表的使用范围,使其可用于所有的内置类型和用户自定义的类型...然后: C++11中列表初始化也可以适用于new表达式中 另外: 创建对象时也可以使用列表初始化方式调用构造函数初始化 比如我们之前写过的日期类: class Date { public:...那initializer_list这个类是个啥呢? initializer_list是C++11引入的一种特殊类型,用于简化初始化列表的使用。...就可以了 然后再提一下就是 如果这里用迭代器遍历的话前面加一个typename,这个我们之前也提过,就是类模板里面直接取内嵌类型它会分不清是类型还是静态成员变量。

    22910

    Python和JavaScript在使用上有什么区别?

    唯一的区别是: 在Python中, 我们在else关键字之后写一个冒号(:) 在JavaScript中, 我们用大括号({})将属于该子句的代码括起来。 ?...不同的是,我们必须用括号包围条件,用大括号将循环体括起来。 ? do..while 循环 在JavaScript中,还有一种Python不存在的循环类型。...唯一的区别是: 在Python中,在类名之后,我们写了一个冒号(:) 在JavaScript中,我们用大括号({})括住类的内容 ?...构造函数和属性 构造函数是一种特殊的方法,当创建类的新实例(新对象)时会调用该方法。它的主要目的是初始化实例的属性。...在Python中,调用了初始化新实例的构造函数init (带有两个前导和尾随下划线)。创建类的实例以初始化其属性时,将自动调用此方法。其参数列表定义了创建实例必须传递的值。

    4.9K20

    列表初始化:轻量级对象initializer_list

    C++98中的初始化方式 在C++98中,数组和聚合类型(如结构体)可以使用大括号{}进行初始化,但基本类型和自定义类对象通常不能直接使用{}初始化,需要使用构造函数或赋值操作。...但是,编译器会进行优化,直接构造d1,避免了拷贝构造。 const Date& d2 = {2024, 7, 25};:引用一个临时的Date对象,该对象由列表初始化创建。...是一个轻量级的只读容器,用于保存初始化列表中的元素。...背景 在C++98中,初始化数组和聚合类型(如结构体)可以使用大括号{},但对于容器和自定义类的初始化,尤其是当需要传入多个参数时,显得不够方便。...std::initializer_list的原理 std::initializer_list是C++11标准库中的一个模板类,用于表示由大括号{}括起来的一系列元素。

    28310
    领券