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

为什么必须在构造函数初始化器中而不是在其体内初始化const成员?

在C++中,构造函数初始化器是一种特殊的语法,用于在创建对象时初始化成员变量。使用构造函数初始化器的主要原因是为了确保成员变量在对象创建时被正确地初始化,并且可以避免多次初始化的问题。

如果在构造函数体内初始化const成员,那么该成员将被多次初始化,这将导致编译错误。因为const成员在对象创建时必须被初始化,而且在整个对象生命周期中其值不能被修改。

因此,为了确保const成员在对象创建时被正确地初始化,并且避免多次初始化的问题,我们需要使用构造函数初始化器来初始化const成员。

例如:

代码语言:c++
复制
class MyClass {
public:
    MyClass(int value) : myConst(value) {}
private:
    const int myConst;
};

在这个例子中,我们使用构造函数初始化器来初始化myConst成员变量,这样可以确保myConst在对象创建时被正确地初始化,并且不会被多次初始化。

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

相关·内容

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

传入的 参数 ; 类初始化时 , 根据定义顺序 , 先调用 成员变量的 构造函数 , 然后调用外部类构造函数 , 析构函数正好相反 ; 实例对象 的 const 成员变量 必须只能在 初始化列表 中进行...初始化 , 所有的构造函数都要进行初始化操作 ; 一、构造函数初始化列表 const 成员变量初始化 1、初始化 const 常量成员 如果 类 定义了 被 const 修饰 的 成员变量..., 那么该成员变量 必须被初始化 , 否则会报错 ; 对象const 成员须在 声明后 立刻进行初始化 ; const 成员初始化 只能通过 构造函数初始化列表 进行初始化 ; 注意...进行赋值 的 , 因此 这里 必须在 构造函数初始化列表const 成员变量 进行赋值 ; 2、错误代码示例 - 没有初始化常量成员 在下面的 类 B , 定义了常量 const int..., 对 常量成员 进行初始化操作 ; 3、正确代码示例 - 在初始化列表初始化常量成员 在下面的 类 B , 所有的 构造函数 , 都要使用 初始化列表 初始化 常量成员 , 只要遗漏一个构造函数

17930

C++:20---成员变量初始化方式

成员变量初始化有三种方式: 在构造函数体内赋值初始化 在自定义的公有函数赋值初始化(一般用于成员变量的初始化) 在构造函数成员初始化列表初始化 一、构造函数体内初始化 说明:在构造函数体内初始化方式...,本质是是为成员变量赋值,不是真正意义上的初始化,这点要特别注意!...说明:与构造函数体内初始化方式一样,此种方式本质上也是赋值,不是初始化 class Cperson { private: int m_age; float m_height; char* m_name...特点: 初始化顺序与书写的在构造函数后的顺序无关,而与成员变量的定义顺序有关(下面有演示案例) 初始化列表初始化优先于构造函数内的代码执行顺序 写在构造函数的后面,随着构造函数的执行执行 初始化顺序...: 多个成员之间用逗号隔开,括号内为形参 一般只对无动态内存的成员const成员、引用初始化const成员、引用成员须在初始化列表初始化成员初始化列表初始化效率更高(下面有演示案例) 有动态内存的成员须在构造函数内部进行初始化

1.8K30

C++:08---成员变量初始化方式

成员变量初始化有三种方式: 在构造函数体内赋值初始化 在自定义的公有函数赋值初始化(一般用于成员变量的初始化) 在构造函数成员初始化列表初始化 一、构造函数体内初始化 说明:在构造函数体内初始化方式...,本质是是为成员变量赋值,不是真正意义上的初始化,这点要特别注意!...说明:与构造函数体内初始化方式一样,此种方式本质上也是赋值,不是初始化 class Cperson { private: int m_age; float m_height; char* m_name...特点: 初始化顺序与书写的在构造函数后的顺序无关,而与成员变量的定义顺序有关(下面有演示案例) 初始化列表初始化优先于构造函数内的代码执行顺序 写在构造函数的后面,随着构造函数的执行执行 初始化顺序...: 多个成员之间用逗号隔开,括号内为形参 一般只对无动态内存的成员const成员、引用初始化const成员、引用成员须在初始化列表初始化成员初始化列表初始化效率更高(下面有演示案例) 有动态内存的成员须在构造函数内部进行初始化

43020

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

1.再谈构造函数 1.1构造函数体赋值 根据之前介绍的内容:在创建对象时,编译通过调用构造函数,给对象各个成员变量一个合适的初始值,我们之前使用的构造函数都叫做函数体内赋初值 class Date...,对象已经有了一个初始值,但是不能将其称为对对象成员变量的初始化构造函数的语句只能将其称为赋初值,不能称作初始化。...因为初始化只能初始化一次,构造函数体内可以多次赋值。 初始化与赋值区别: 初始化是在创建变量时为其赋予一个初始值。在构造函数初始化通常是在对象创建时对成员变量进行赋值。...之前函数体内赋值不是用的好好的嘛,来这个干嘛?...,与其在初始化列表的先后次序无关 解决的问题: 必须在定义的地方显示地初始化:引用 const 没有默认构造函数的自定义成员 有些自定义成员想要自己控制自己的初始化 1.2.4特殊情况 class Stack

56110

【c++】类和对象(六)深入了解隐式类型转换

,对象已经有了一个初始值,但是不能将其称为对对象成员变量的初始化构造函数的语句只能将其称为赋初值,不能称作初始化。...,这个只是一个声明,定义是对象实例化时候完成的,有些成员,必须在定义的时候进行初始化 初始化列表的每个元素都直接对应一个成员变量或基类,允许在构造函数体执行之前对这些成员或基类进行初始化。...在类构造函数成员变量的行为类似于局部变量,如果不在初始化列表显式初始化,它们将不会被自动初始化 _n是通过初始化列表初始化的,因为它是const类型的,必须在那里初始化。...初始化列表提供了一种高效、直接初始化成员变量和基类的方式,构造函数则完成剩余的初始化逻辑和设置,比如动态开辟一个数组进行赋值的时候,就用到函数成员变量在类声明次序就是其在初始化列表初始化顺序...然而,成员变量的初始化顺序是由它们在类声明的顺序决定的,不是它们在初始化列表中出现的顺序。在A类,_a2在_a1之前声明,因此_a2会先于_a1初始化

10310

C++奇迹之旅:初始化列表与explicit

但是不能将其称为对对象成员变量的初始化构造函数的语句只能将其称为赋初值,这和我们之间常常说的给缺省值其实就是赋初值,不能称作初始化。...因为初始化只能初始化一次,构造函数体内可以多次赋值。...const int _x; }; 由于const须在定义时就要进行初始化,而这个在构造函数_x=1的行为是赋值行为,不是初始化,因此const 修饰_x无法再赋值。...而有些特殊的成员变量需要再定义的时候就初始化不是再通过赋值。...)采用函数体内赋值的方式初始化 B::B(const A& a) { m_a = a; ... } 本例第一种方式,类B的构造函数在其初始化列表里调用了类A的拷贝构造函数,从而将成员对象 m_a初始化

6810

【C++】类和对象之初始化列表与static成员

,对象已经有了一个初始值,但是不能将其称为对对象成员变量的初始化构造函数的语句只能将其称为赋初值,不能称作初始化。...因为初始化只能初始化一次,构造函数体内可以多次赋值。...这里是显示的调构造 【注意】 每个成员变量在初始化列表只能出现一次(初始化只能初始化一次) 类包含以下成员,必须放在初始化列表位置进行初始化,不能在函数体内初始化: (1)引用成员变量...(2)const成员变量 (3)自定义类型成员(且该类没有默认构造函数时) 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。...不会,2构造一个临时对象,再拷贝构造 -> 编译优化了,同一个表达式连续步骤的构造,一般会被合二为一 这个代码为什么可以? 类型转换会产生临时变量。

10710

万字长文【C++】高质量编程指南

const常量完全可以取代宏常量。 (1)不能再类声明初始化 const数据成员,因为类的对象未被创建时,编译不知道 SIZE的值是多少。...8.4.2.构造函数初始化列表 初始化列表工作发生在函数体内的任何代码被执行之前 1,如果类存在继承关系,派生类必须在其初始化列表里调用基类的构造函数 class A {… A(int x); //...A 的构造函数 { … } 2,类的const常量只能在初始化列表里被初始化,因为它不能在函数体内赋值的方式来初始化 3,非内部数据类型的成员对象应当采用初始化列表方式来初始化,以获取更高的效率。...{ m_a = a; … } 注意:成员对象初始化的次序完全不受他们再初始化的次序的影响,只由成员对象在类声明的次序决定,因为类的声明是唯一的,类的构造函数可以有多个,因此会有不同次序的初始化表...8.4.4.派生类实现类的基本函数 1,派生类的构造函数在其初始化列表调用基类的构造函数 2,基类与派生类的析构函数应该设置virtual class Base { public: virtual

1.4K20

【C++类和对象】初始化列表与隐式类型转换

它通过在构造函数的参数列表后面使用冒号来指定成员变量的初始化值,不是构造函数体内使用赋值语句来初始化。...虽然上述构造函数调用之后,对象已经有了一个初始值,但是不能将其称为对对象成员变量的初始化构造函数的语句只能将其称为赋初值,不能称作初始化。...因为初始化只能初始化一次,构造函数体内可以多次赋值。 初始化列表: 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号的初始值或表达式。...int& _ref; // 引用 const int _n; // const }; 在上面的例子,常量成员变量 _n必须在构造函数初始化列表中进行初始化,因为常量成员变量在对象创建后不能修改...没有默认构造函数的类类型成员变量_aobj:如果成员变量是一个类类型的对象,并且该类没有默认构造函数(无参构造函数),则必须在初始化列表调用该类的有参构造函数进行初始化

9810

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

因为初始化只能初始化一次,构造函数体内可以多次赋值。...int _x;// const // 必须在初始化列表初始化,并在定义时初始化 int& _ref;// 引用 }; 初始化列表是C++构造函数的一个特性,它允许在构造函数体执行之前初始化类的成员变量...这对于 const 成员、引用成员或没有默认构造函数的自定义类型成员特别重要,因为它们必须在构造函数体执行之前被初始化。...初始化列表不仅仅是为了初始化这些特殊类型的成员,它还可以提高效率,因为它允许直接构造对象,不是先默认构造然后再赋值。...例如 A a1 = 1;,在这种情况下,编译会识别出这是一个对象初始化的过程,可以直接调用构造函数不是先创建临时对象再调用拷贝构造函数。 当函数调用跨越不同表达式时,编译无法进行同样的优化。

5210

C++编译与链接(0)-.h与.cpp的定义与声明

static函数 在不同的cpp可以定义函数原型一样的函数 类 不同的cpp类的名字可以一样 类成员函数 在.h定义,所有成员须在声明,在cpp实现 非静态的常量整形数据成员不能就地初始化...show@A@@QAEXXZ) 已经在 a.obj 定义    类的const成员 在类声明变量为const类型的成员不可以就地初始化 const常量的初始化须在构造函数初始化列表初始化不可以在构造函数函数体内初始化...inline说明 否则在被include多次时会出现重定义错误 类const数据 ------------------ 不可以 1、在类声明变量为const类型的成员不可以就地初始化 const常量的初始化须在构造函数初始化列表初始化...,不可以在构造函数函数体内初始化 2、同类数据成员的特殊说明 类的静态的数据成员 ------------------- 不可以 不可以就地初始化,需要到.cpp中进行定义 (对于非常量的静态成员变量...需要到头文件以外去定义它) 类的静态的常量整形数据成员 ------------------ 可以 特殊说明 模板 模板函数与模板类的声明与实现必须放在一个文件 至于为什么会这样,与C++的编译和链接

3.5K70

【C++】类和对象(完结篇)

因为初始化只能初始化一次(即在定义的时候赋初值),构造函数体内可以对成员变量进行多次赋值。 这里注意初始化(定义的时候赋初值)和赋值的区别。...当然: 在构造函数体内我们还可以再为成员变量赋值 注意这里成员_b被const修饰,不能再被赋值了。...成员变量 没有默认构造函数的自定义类型成员 首先const成员变量: 我们上面举的例子就是const成员变量,它必须在定义的时候赋初值,所以必须在初始化列表对其进行初始化(定义的时候赋初值),当然...但是: 加个const就行了。 为什么呢? ,这是不是我们之前在常引用那里讲过的啊: 这里产生了临时变量,临时变量具有常性,所以我们加了const就行了。...const修饰非静态成员函数,实际修饰的是this指针,友元函数根本都不是成员函数,所以都没有this指针。

14510

认真理一理C++的构造函数

为什么需要构造函数 有的人可能会奇怪,发现自己写的代码即便没有初始化,也有正常的初始值,而且每次运行都是一样,不是随机的,这是为什么呢?...如果类某个成员它自己没有默认构造函数(无参构造函数),那么编译也就不能合成默认构造函数。...初始化const和引用成员 不知道你是否还记得,对于const类型或者是引用类型,我们必须给它初始化,因此对于有const或者引用的成员变量,必须在构造函数给它初始化,注意是初始化不是赋值。...,可以使用拷贝形式的初始化某个成员它自己没有默认构造函数(无参构造函数),那么编译也就无法合成默认构造函数 如果定义了自己的构造函数,编译将不会合成默认构造函数 对于有const或者引用的成员变量...,必须在构造函数给它初始化 参考:《C++ primer》

53420

const的那些事

3.const对象默认为文件局部变量 注意:非const变量默认为extern。要使const变量能够在其他文件访问,必须在文件显式地指定它为extern。...给src加上const修饰后,如果函数体内的语句试图改动src的内容,编译将指出错误。这就是加了const的作用之一。 (3)参数为引用,为了增加效率同时防止修改。...因为函数体内将产生A 类型 的临时对象用于复制参数a,临时对象的构造、复制、析构过程都将消耗时间。...如果在编写const成员函数时,不慎修改 数据成员,或者调用了其它非const成员函数,编译将指出错误,这无疑会提高程序的健壮性。使用const关 字进行说明的成员函数,称为常成员函数。...这里提到了static,下面简单的说一下: 在C++,static静态成员变量不能在类的内部初始化。在类的内部只是声明,定义必须在类定义体的外部,通常在类的实现文件初始化

60430

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

深究构造函数 构造函数体赋值与初始化 在创建对象时,编译通过调用构造函数,给对象各个成员变量一个合适的初始值。...,但是不能将其称为对对象成员变量的初始化构造函数体内的语句只能将其称为赋初值,不能称作初始化。...因为初始化只能初始化一次(定义时),构造函数体内可以多次赋值。 那么一个类对象真正的定义初始化是在什么时候的呢?就在接下来提到的初始化列表当中。...提到过编译生成的构造函数,拷贝构造函数对于自定义类型成员的处理是调用其对应的构造函数和拷贝构造函数,其实这也是通过初始化列表调用的。..._day; }; 类包含以下成员,必须放在初始化列表位置进行初始化: 引用成员变量 const成员变量 自定义类型成员变量(且该类型没有默认构造函数时) 尽量使用初始化列表初始化

39220

C++primer学习笔记(五)

成员函数是否为const等同于形参this是否const,所以可以重载。mutable用来声明数据成员可以修改【突破各种const的限制】。 使用类外全局作用域的变量可以::var来获得。...类const成员须在初始化列表初始化,无法再构造函数体内赋值。初始化const或引用类型或没有默认构造函数的类类型数据成员的唯一机会是构造函数初始化列表【冒号开始,逗号分隔】。...初始化顺序由定义顺序决定,不是初始化列表顺序。 友元:将非公有成员的访问权授予指定的类或函数。friend在类定义内部。友元引入的类名和函数(定义或声明)可以像预先声明的一样使用。...初始化时是否调用复制构造函数取决于是否有=【拷贝构造函数,复制也叫拷贝构造函数是用同一个类的一个对象初始化另一个对象,普通构造函数是用各种参数初始化一个类的对象】。...即使定义了其他构造函数,也会合成复制构造函数【能够复制类的数组】。类成员有指针一般需要显示定义复制构造函数。 声明不定义成员函数是合法的,但是使用将导致链接失败。

35810

【C++】类和对象 (下篇)

,对象个成员变量已经有了一个初始值,但是不能将其称为对对象成员变量的初始化构造函数函数的语句只能将其称为赋初值,不能称作初始化;因为初始化只能初始化一次,构造函数体内可以进行多次赋值;那么成员变量在哪里初始化呢...,编译就会报错; 3、如果类包含以下成员,则必须放在初始化列表初始化: 引用成员变量; const 成员变量; 没有默认构造的自定义类型; 在前面的学习我们知道,引用是一个变量的别名,它必须在定义的时候初始化...,并且一旦引用了一个变量就不能再去引用另一个变量;同样,const 作为只读常量,也必须在定义的时候初始化,且初始化之后不能在其他地方修改; 通过上面的学习,构造函数函数体内执行的是赋值语句,成员变量只能在初始化列表进行定义与初始化...: 所以对于使用 const 修饰的以及引用类型的成员变量,我们必须在初始化列表处对其进行初始化: 同样,对于没有默认构造函数的自定义类型来说,我们也必须在初始化列表处对其进行初始化,否则编译就会报错...对象的引用,所以编译会先用2022来构造一个Date类型的临时对象,然后d4再对这个临时对象进行引用,所以只会调用一次构造函数;同时由于临时对象具有常性,所以需要使用const修饰; 注意:单参构造函数不是指只能有一个参数

45200

那些你不知道的类和对象的知识

,还有骨子里的自信与淡定✨ 一、构造函数的深入理解 1.1 初始化列表 前面,我们已经学习过构造函数,在创建对象的时候,编译会自动调用构造函数,用于给初始化对对象的成员变量赋予初始值.那构造函数体内的语句时初始化吗...,因为初始化只能初始化一次,是指变量在创建的时候被赋予的初始值.构造函数体内可以进行多次赋值....当一个类的构造函数被声明为explicit时,编译将不会自动执行隐式类型转换,只能进行显式类型转换。这样会提高代码的可读性,隐式类型转换可读性不好..../函数 (1)定义 静态成员变量和静态成员函数是属于类不是对象的成员。...静态成员函数可以直接通过类名进行调用,不需要创建类的实例对象。 (2)静态成员函数为什么一定要在类外面初始化: C++的静态成员变量在程序运行时被分配内存,但是它们的定义是在编译时就已经完成的。

18120

【C++】类与对象(static、explicit、友元、隐式类型转换、内部类、匿名对象)

今日更新了类与对象static、explicit、友元、隐式类型转换、内部类、匿名对象的内容 欢迎大家关注点赞收藏⭐️留言 再谈构造函数 构造函数的语句只能将其称为赋初值,不能称作初始化。...因为初始化只能初始化一次,构造函数体内可以多次赋值。 初始化列表 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号的初始值或表达式。...const int _n不能在函数体内初始化,因为它只能初始化一次,函数体内可以多次赋值。 建议能用初始化列表就用初始化列表。...注意: 每个成员变量在初始化列表只能出现一次(初始化只能初始化一次) 类包含以下成员,必须放在初始化列表位置进行初始化: 引用成员变量 const成员变量 自定义类型成员(且该类没有默认构造函数时)...下面是使用友元的方案: 友元函数可访问类的私有和保护成员,但不是类的成员函数 友元函数不能用const修饰 友元函数可以在类定义的任何地方声明,不受类访问限定符限制 一个函数可以是多个类的友元函数 友元函数的调用与普通函数的调用原理相同

8810
领券