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

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

构造函数初始化列表 总结 : 初始化列表 可以 为 类的 成员变量 提供初始值 ; 初始化列表 可以 调用 类的 成员变量 类型的 构造函数 进行成员变量初始化操作 ; 初始化列表 可以 使用 构造函数...传入的 参数 ; 类初始化时 , 根据定义顺序 , 先调用 成员变量的 构造函数 , 然后调用外部类构造函数 , 析构函数正好相反 ; 实例对象 的 const 成员变量 必须只能在 初始化列表 中进行...初始化 , 所有的构造函数都要进行初始化操作 ; 一、构造函数初始化列表 为 const 成员变量初始化 1、初始化 const 常量成员 如果 类 定义了 被 const 修饰 的 成员变量...========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== 在编译时 , 所有的 构造函数 上 , 都会报错 ; 所有的 构造函数 , 都必须 初始化列表..., 对 常量成员 进行初始化操作 ; 3、正确代码示例 - 初始化列表初始化常量成员 在下面的 类 B , 所有的 构造函数 , 都要使用 初始化列表 初始化 常量成员 , 只要遗漏一个构造函数

16330

C++构造函数初始化列表

构造函数的一项重要功能是对成员变量进行初始化,为了达到这个目的,可以构造函数函数对成员变量一一赋值,还可以采用初始化列表。...C++构造函数初始化列表使得代码更加简洁,请看下面的例子: #include using namespace std; class Student{...使用构造函数初始化列表并没有效率上的优势,仅仅是书写方便,尤其是成员变量较多时,这种写法非常简单明了。初始化列表可以用于全部成员变量,也可以只用于部分成员变量。...成员变量的赋值顺序由它们的声明顺序决定, Demo 类,我们先声明的 m_a,再声明的 m_b,所以构造函数和下面的代码等价: Demo::Demo(int b): m_b(b), m_a...obj 栈上分配内存,成员变量的初始值是不确定的。 初始化 const 成员变量 构造函数初始化列表还有一个很重要的作用,那就是初始化 const 成员变量。

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

C++构造函数初始化列表

构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号初始化式。例如: ? 上面的例子两个构造函数的结果是一样的。...1.成员类型是没有默认构造函数的类。若没有提供显示初始化式,则编译隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译尝试使用默认构造函数将会失败。 2.const 成员或引用类型的成员。...1.内置数据类型,复合类型(指针,引用)- 成员初始化列表构造函数体内进行,性能和结果上都是一样的 2.用户定义类型(类类型)- 结果上相同,但是性能上存在很大的差别。...因为类类型的数据成员对象进入函数体前已经构造完成,也就是说成员初始化列表处进行构造对象的工作,调用构造函数进入函数体之后,进行的是对已经构造好的类对象的赋值,又调用个拷贝赋值操作符才能完成(如果并未提供...初始化列表的成员初始化顺序: C++ 初始化类成员时,是按照声明的顺序初始化的,而不是按照出现在初始化列表的顺序。 ?

1.9K20

C++构造函数初始化列表 ⑤ ( 匿名对象 生命周期 | 构造函数 不能调用 构造函数 )

构造函数初始化列表 总结 : 初始化列表 可以 为 类的 成员变量 提供初始值 ; 初始化列表 可以 调用 类的 成员变量 类型的 构造函数 进行成员变量初始化操作 ; 初始化列表 可以 使用 构造函数...传入的 参数 ; 类初始化时 , 根据定义顺序 , 先调用 成员变量的 构造函数 , 然后调用外部类构造函数 , 析构函数正好相反 ; 实例对象 的 const 成员变量 必须只能在 初始化列表 中进行...二、构造函数 调用 构造函数 ---- 1、构造函数 不能调用 构造函数 构造函数 调用 构造函数 是危险行为 ; 构造函数 调用 构造函数 , 并不会为本对象进行初始化操作 ; 构造函数 的调用方式..., 天然就会创建一个 匿名对象 , 如果 没有变量 接收 这个 匿名对象 , 该匿名对象 本行表达式执行完毕后 , 就会被销毁 ; 2、代码示例 - 构造函数调用构造函数 下面的代码 , 先定义...执行 Student 的构造函数" << endl; } 然后 , 无参的 构造函数 , 调用 有参构造函数 ; // 构造函数 调用 构造函数 是危险行为 Student() { /

17120

类——构造函数初始化列表

构造函数体内部,我们直接可以用类的成员变量来赋值,但是调用构造函数前是没有这个类对象的,既然都没有这个类对象,哪前面我们直接用来赋值的类的成员变量是哪里来的?        ...再谈构造函数 1.1 构造函数体赋值 我们先来复习一下构造函数,如下: 创建对象时,编译通过调用构造函数,给对象各个成员变量一个合适的初始值。...: 初始化列表不就是定义赋值罢了,我们构造函数体内二次赋值,结果不是一样的吗?...每个成员变量初始化列表只能出现一次(初始化只能初始化一次) 2....:初始化列表的缺省值——定义缺省值) 1.2.5初始化列表的顺序 成员变量声明次序就是其初始化列表初始化顺序,与其初始化列表的先后 次序无关。

78420

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

; 此时使用 默认无参构造函数 初始化 B , 就会报错 ; 一个类 , 其成员变量是 带有参构造函数 的类型 , 这种情况下没有调用 有参构造函数的机会 , 此时就会出现 编译报错情况 ; 在下面的代码...就是 C++ 构造函数 初始化列表 ; 2、错误代码示例 代码示例 : #include "iostream" using namespace std; class A { public: /...========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== 二、构造函数初始化列表 ---- 1、构造函数初始化列表语法规则 C++ 语言中 , 构造函数初始化列表...(成员变量值) , 成员变量名称(成员变量值) { // 构造函数内容 } 构造函数初始化列表 位置 构造函数 的 参数列表之后 , 冒号 : 与花括号 {} 之间 ; 使用 逗号 , 分隔 ;...初始化列表的元素由 成员变量的名称 和 初始值组成 , 使用等号 = 连接 ; 在下面的代码 , 为 B 类定义了默认的构造函数 , 其中定义了 构造函数 初始化列表 ; 初始化列表 , m_age

42030

C++构造函数初始化列表 ④ ( 构造函数 和 析构函数 调用顺序分析 )

和 B 构造函数 初始化列表 的顺序 , 与先调用谁的构造函数无关 ; 2、析构函数调用顺序 析构函数调用顺序 与 构造函数调用顺序相反 , 直接 将 构造函数 调用顺序 倒序排列即可 ; 3、...拷贝构造函数也可以定义初始化列表 如果一个类 没有定义 无参构造函数 , 只有一个 有参的构造函数 , 此时 , C++ 编译 不会为其 生成 默认的无参构造函数 ; 这种场景下 涉及到了 构造函数...的类型 : 强制初始化列表调用构造函数 : 如果类定义了 有参构造函数 , 导致 无参构造函数 被屏蔽 , 那么 所有的构造函数初始化列表 , 都必须强制调用 子对象 的 构造函数 ;...不强制初始化列表调用构造函数 : 如果类定义了 无参构造函数 , 或者 有默认的 无参构造函数 , 那么 初始化列表 不强制调用 子对象 的构造函数 ; 使用如下方式 , 声明 A 和 B 类型的成员变量..., 因此 类 C 的所有构造函数 ( 包括 拷贝构造函数 ) 的 初始化列表 , 必须强制调用 A 和 B 的 有参构造函数 ; 此外由于 还定义了 const int m_const_int 常量成员

20620

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

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

17830

C++构造函数体内赋值与初始化列表的区别

someClass(const int& num,const string& name) :this->num(num),this->studentNmae(name) {} }; 阅读以上错误代码,需要注意,使用初始化列表完成类数据成员初始化时...化列表不能使用this,那构造函数体内是否可以使用this呢?...答案是可以,因为构造函数对成员数据的初始化初始化列表完成的,构造函数体内对数据成员所做的工作仅仅是赋值操作,在此之前,类成员数据已经完成了初始化工作,是由其默认构造函数完成的。...所以,这也是编程原则尽量使用初始化列表的原因。...将上面错误代码的类数据成员的初始化改为构造函数体内赋值,则没有问题,代码修改如下: class someClass { int num; string studentNmae; public:

1.4K21

C++构造函数体内赋值与初始化列表的区别

1.C++构造函数初始化列表处提示出现 error: expected ‘{’ before ‘this’ 问题描述下: Linux环境运行,使用g++编译,贴上如下代码出错处已标注于代码。...得知网友点拨后,才知道其原因是类对象完成初始化之前,类对象还未成形,不能使用this指针。以上问题的解决方案就是去掉this。...---- 2.初始化列表不能使用this,那构造函数体内是否可以使用this呢?...答案是,当然可以,因为构造函数对成员数据的初始化初始化列表完成的,构造函数体内对数据成员所做的工作仅仅是赋值操作,在此之前,类成员数据已经完成了初始化工作,是由其默认构造函数完成的。...所以,这也是编程原则尽量使用初始化列表的原因。

83820

C++构造函数意义 ( 构造函数显式调用与隐式调用 | 构造函数替代方案 - 初始化函数 | 初始化函数缺陷 | 默认构造函数 )

, 则无法进行初始化操作 ; 5、默认构造函数 如果 定义 类 时 , 没有写 构造函数 , C++ 编译 会 为类 提供一个默认构造函数 ; 默认构造函数函数体为空 , 不需要开发者定义 ,...由 C++ 编译默认提供 ; 默认构造函数 分为 2 种类型 : 默认无参构造函数 : 如果 类 没有定义 构造函数 , C++ 编译 会默认提供一个 无参构造函数 , 该构造函数函数体为空...; 默认拷贝构造函数 : 如果 类 没有定义 拷贝构造函数 , C++ 编译 会默认定义一个 默认拷贝构造函数 , 该函数的作用是进行简单的成员变量赋值 ; 6、代码示例 - 初始化函数无法及时调用...下面的代码 Student 类 , 定义了初始化 函数 : // 初始化函数 初始化 实例对象 void init(int _age, int _height) { m_age =..., C++ 编译 会提供一个 默认构造函数 // Student 类 没有提供拷贝构造函数 , C++ 编译 会提供一个 默认拷贝构造函数 Student s; // 调用初始化函数 s.init

33920

C++类与对象(四):再谈构造函数(详解初始化列表)、Static成员

1.再谈构造函数 1.1构造函数体赋值 根据之前介绍的内容:创建对象时,编译通过调用构造函数,给对象各个成员变量一个合适的初始值,我们之前使用的构造函数都叫做函数体内赋初值 class Date...因为初始化只能初始化一次,而构造函数体内可以多次赋值。 初始化与赋值区别: 初始化创建变量时为其赋予一个初始值。构造函数初始化通常是在对象创建时对成员变量进行赋值。...初始化可以变量声明时进行,也可以构造函数初始化列表中进行(下面就介绍)。 赋值是变量已经存在的情况下改变变量的值。...解决方案: 写出来默认构造 初始化列表处显示地写出来 1.2.3特性 每个成员变量初始化列表只能出现一次(初始化只能初始化一次) 类包含以下成员,必须放在初始化列表位置进行初始化:(由来里讲了...) 引用成员变量 const成员变量 自定义类型成员(且该类没有默认构造函数时) 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化 成员变量声明次序就是其初始化列表初始化顺序

29810

C++】STL 容器 - vector 动态数组容器 ③ ( vector 容器初始化 - 初始化列表 | vector 容器赋值 - assign 函数 swap 函数 )

C++ 标准模板库 ( Standard Template Library , STL ) 的一个动态数组 容器 , 该容器有如下初始化方式 : 默认初始化 : 创建一个空的 vector 容器 ;...2, 3}; 使用数组初始化 : 向 vector 容器 构造函数 传递一个数组数组个数 , 来初始化 vector 容器 // 先声明一个数组 int array[] = {1, 2, 3,...4, 5}; // 将整个数组的值 初始化给 vector 容器 vector vec(array, array + sizeof(array) / sizeof(int)); 使用迭代范围初始化...: 通过传递两个迭代来指定要复制的元素范围 ; // 初始化一个 vector 容器 vector vec1 {1, 2, 3}; // 使用 范围构造函数 从 vec1 容器 复制元素到...vec2 容器 vector vec2(vec1.begin(), vec1.end()); 2、使用 std::initializer_list 初始化列表 初始化 vector 容器 之前的有参构造函数

37510

C++列表初始化,你知多少?

我是木荣,今天我们学习一下C++列表初始化相关的知识。 unsetunset1、何为列表初始化unsetunset C++列表初始化是一种用一对花括号 {} 来进行对象初始化的语法。...类型不匹配时可能调用构造函数列表初始化的类型和目标类型不匹配时,如果存在适当的构造函数,编译会尝试调用构造函数进行初始化。...对于类类型,构造函数的匹配规则 当进行列表初始化时,编译会根据构造函数的参数匹配规则选择相应的构造函数。...int x = {3.14}; // 错误,尝试缩窄转换 构造函数匹配: 当进行列表初始化时,如果存在适当的构造函数,编译会尝试调用构造函数进行初始化。...这是因为 C++ ,如果声明一个函数的时候带有空括号,编译会将其解释为一个函数声明而不是一个对象定义。

4710

C++】STL 容器 - vector 动态数组容器 ② ( vector 有参构造函数 | 范围构造函数 | 初始化 n 个 指定元素 | 拷贝构造函数 )

文章目录 一、vector 有参构造函数 1、使用另外的 vector 对象初始化 - 范围构造函数 2、vector 容器初始化 n 个 指定元素 3、vector 容器拷贝构造函数 4、代码示例 -...vector 容器有参构造函数 一、vector 有参构造函数 1、使用另外的 vector 对象初始化 - 范围构造函数 vector 动态数组容器 , 初始化时 , 可以使用另外的 vector...; 特别注意 : 该构造函数并不会检查 begin 和 end 是否有效 , 使用之前务必验证 迭代 的范围是否合法 , 如果出现越界会导致异常 ; 代码示例 : 在下面的代码初始化 vec1...与 使用两个迭代范围进行初始化构造函数略有不同 ; 使用两个迭代范围进行初始化时 , 会复制指定范围内的所有元素到新创建的 vector ; 本构造函数 使用 n 和 元素值 进行初始化时...动态数组容器 // 该容器 有 3 个元素 , 每个元素值为 字符 `A` std::vector vec(3, 'A'); 3、vector 容器拷贝构造函数 vector 容器拷贝构造函数

20310

从零开始学C++构造函数与析构函数(二):初始化列表(const和引用成员)、拷贝构造函数

一、构造函数初始化列表 推荐构造函数初始化列表中进行初始化 构造函数的执行分为两个阶段 初始化段 普通计算段 (一)、对象成员及其初始化 #include  using namespace...再提一点,如果类是继承而来,基类没有默认构造函数的时候,基类的构造函数要在派生类构造函数初始化列表调用。...因为const 变量或者引用都得定义的时候初始化,所以const 成员和引用成员必须在初始化列表初始化。另外,可以使用定义枚举类型来得到类作用域共有的常量。...因为局部对象离开建立它的函数时就消亡了,不可能在返回调用函数后继续生存,所以处理这种情况时,编译系统会在调用函数的表达式创建一个无名临时对象,该临时对象的生存周期只函数调用处的表达式。...函数传参和返回都没有调用构造函数,t2 是引用故也不会调用拷贝构造函数。 参考: C++ primer 第四版 Effective C++ 3rd C++编程规范

1.2K00

C++】多态 ⑨ ( vptr 指针初始化问题 | 构造函数 调用 虚函数 - 没有多态效果 )

, 则 没有 多态效果 ; 一、vptr 指针初始化问题 1、vptr 指针与虚函数表 " 虚函数表 " 由 C++ 编译 负责 创建 与 维护 , 被 virtual 关键字 修饰的 虚函数 ,...会自动 被 C++ 编译 存储到 " 虚函数表 " , 类中会自动添加一个 " vptr 指针 " 成员变量 指向 虚函数表 ; 2、vptr 指针初始化时机 对象的 vptr 指针 指向 虚函数表..., 对象 被 创建时 , 由 C++ 编译 对 对象的 vptr 指针进行初始化操作 , 对象 创建完成 后 , 也就是 虚函数 整理完毕 , 全部放到 虚函数后 , vptr 指针 才会指向... 调用 虚函数 , 则 没有 多态效果 ; 父类 的 构造函数 , 调用了 父类的 虚函数 ; 此时 , 如果 创建 子类对象 , 执行 父类构造函数 , 仍然调用 父类 的虚函数 , 子类的虚函数...没有被调用 , 说明 构造函数 执行期间 , 多态没有生效 ; 参考 【C++】继承 ⑧ ( 继承 + 组合 模式的类对象 构造函数 和 析构函数 调用规则 ) 博客构造函数 调用规则 : 构造函数

20020

为什么应该尽可能避免静态构造函数初始化静态字段?

不同的是Foo以内联(inline)赋值的方法进行初始化,而Bar则将初始化操作定义静态构造函数。...如下所示的两段IL代码分别来源于Foo和Bar,我们可以看到虽然Foo类没有显式定义静态构造函数,但是编译会创建一个默认的静态构造函数,针对静态字段的初始化就放在这里。...但是当我们调用一个并不涉及类型静态字段的Invoke方法时,定义Foo的静态构造函数会自动执行,但是定义Bar的则不会,由此可以看出一个类型的静态构造函数的执行时机与类型是否具有beforefieldinit...具体规则如下,这一个规则直接定义CLI标准ECMA-335,静态构造函数在此标准中被称为类型初始化(Type Initializer)或者.cctor。...四、关于“All-Zero”结构体 如果我们一个结构体显式定义了一个静态构造函数,当我们调用其构造函数之前,静态构造函数会自动执行。

14910

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

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

5.8K40
领券