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

为什么在C++中不允许初始化整数成员变量(不是const static)?

在C++中,不允许直接在类定义中初始化整数成员变量(非const static)的原因是为了保持一致性和可维护性。

  1. 一致性:C++中的类定义只是描述了对象的布局和行为,而不是对象的实际实例。初始化成员变量的工作应该由构造函数来完成,这样可以确保所有对象都按照相同的方式进行初始化,保持一致性。
  2. 可维护性:将初始化工作放在构造函数中可以更好地组织和管理代码。如果允许在类定义中直接初始化成员变量,可能会导致代码的散乱和混乱,难以维护和理解。

虽然在C++11之后,可以使用成员初始化列表来初始化非静态成员变量,但这种方式仍然是在构造函数中进行初始化,而不是在类定义中。

总结起来,不允许在C++中直接初始化整数成员变量是为了保持一致性和可维护性,将初始化工作统一放在构造函数中进行。

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

相关·内容

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

初始化 , 所有的构造函数都要进行初始化操作 ; 一、构造函数 的 初始化列表 const 成员变量初始化 1、初始化 const 常量成员 如果 类 定义了 被 const 修饰 的 成员变量..., 那么该成员变量 必须被初始化 , 否则会报错 ; 对象const 成员 必须在 声明后 立刻进行初始化 ; const 成员初始化 只能通过 构造函数 的 初始化列表 进行初始化 ; 注意...: 这里区分 初始化 与 赋值 , 初始化变量 声明时 同时 为其 设置一个 初始化值 ; 赋值 是 变量 声明以后 , 再对变量进行赋值 ; const 成员变量 是常量 , 是 无法声明后...进行赋值 的 , 因此 这里 必须在 构造函数的 初始化列表const 成员变量 进行赋值 ; 2、错误代码示例 - 没有初始化常量成员 在下面的 类 B , 定义了常量 const int..., 对 常量成员 进行初始化操作 ; 3、正确代码示例 - 初始化列表初始化常量成员 在下面的 类 B , 所有的 构造函数 , 都要使用 初始化列表 初始化 常量成员 , 只要遗漏一个构造函数

22130

那些陌生的C++关键字

C++使用typename的情况有两种: 第一种情况是函数模板和类模板声明。一般模板声明,使用class关键字指定类型参数,后来C++支持使用typename代替class关键字。...这样编译器就明确类型T引出的成员是类型,而不是变量或者函数名。因此,typename的使用范围也被限定在模板函数内部。...我们知道类的常成员函数语义上是不允许修改类的成员变量的,但是有时候可能根据代码的需要并不是这么绝对。那么就可以使用mutable声明一个类的成员变量,它告诉编译器类的常成员函数可以修改这个变量。...五、explicit Explicit的含义是显式的,它和C++的隐式转换相关。例如: double a=100; 编译器会自动将整数100转化为浮点类型。...正因为此《C++ Primer》也假设了编译器了的工作方式: int temp=x+1; const int &cy=temp; 如果按照这种工作方式,cx引用的内存单元应该不是x的内存单元,但是VS2010

95970
  • CC++常见面试知识点总结附面试真题—-20220326更新

    cconst仅仅是从编译层来限定,不允许const 变量进行赋值操作,在运行期是无效的,所以并非是真正的常量(比如通过指针对const变量是可以修改值的),但是c++是有区别的,c++在编译时会把...5 ). c++只有用字面量初始化const常量会被加入符号表,而变量初始化const常量依然只是只读变量。...6). c++const成员为只读变量,可以通过指针修改const成员的值,另外const成员变量只能在初始化列表中进行初始化。 下面我们通过代码来看看区别。...最后补充一点题外话,new 申请内存的时候就可以初始化(如下代码), 而malloc是不允许的。...类的静态成员变量和静态成员函数各有哪些特性? 静态成员变量 1). 静态成员变量需要在类内声明(加static),类外初始化(不能加static),如下例所示; 2).

    1.5K10

    C++知识概要

    ,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。...静态变量初始化 静态局部变量和全局变量一样,数据都存放在全局区域,所以主程序之前,编译器已经为其分配好了内存。 C++ 初始化执行相关代码时才会进行初始化。...为什么 C++空类的大小不为 0,不同编译器设置不一样,vs 设置为 1 C++标准指出,不允许一个对象(当然包括类对象)的大小为 0,不同的对象不能具有相同的地址 带有虚函数的 C++类大小不为...注意它与数据结构的堆是两回事,分配方式倒是类似于链表 全局区(静态区)(static) — 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量一块区域,未初始化的全局变量和未初始化的静态变量相邻的另一块区域...每个变量相对于起始位置的偏移量必须是该变量类型大小的整数倍,不是整数倍空出内存,直到偏移量是整数倍为止 最后整个结构体的大小必须是里面变量类型最大值的整数倍 class A{ int a;

    1.1K20

    C++之类和对象

    自此结构体升级成了类,定义的变量叫做成员变量定义的函数称为成员函数或者成员方法,不过一般C++定义类时更喜欢用“class”关键字。...(C语言中是习惯先定义变量再使用),但是一般我们见到的C++程序都是将成员函数写在成员变量的前面,这是为什么呢?...**前面说了构造函数只是赋值并不是初始化,真正的初始化只有初始化列表,所以引用成员变量const成员变量都必须显示的写在初始化列表。...---- 5.成员变量声明的顺序就算初始化的顺序,也就是说初始化看的不是初始化列表显示定义的顺序而是看类的声明顺序: class A { public: A(int a=1) :_a2(...关键字,类只是声明; 静态成员变量的访问受类域与访问限定符的约束; 因为静态成员变量不是属于任一类对象的而是存在于静态区由所有对象共享的所以不能将静态成员变量写入初始化列表: 写道初始化列表成员变量每个成员被实例化时就会定义并且初始化

    1.2K00

    硬钢百度面试!

    定义时要分配空间,不能在类声明初始化,必须在类定义体外部初始化初始化时不需要标示为static;可以被非static成员函数任意访问。...static成员函数:不具有this指针,无法访问类对象的非static成员变量和非static成员函数;不能被声明为const、虚函数和volatile;可以被非static成员函数任意访问 静态局部变量...,这样就可以两个文件同时使用同一个变量const 不考虑类的情况 const常量定义时必须初始化,之后无法更改 const形参可以接收const和非const类型的实参,例如// i 可以是 int...考虑类的情况 const成员变量:不能在类定义外部初始化,只能通过构造函数初始化列表进行初始化,并且必须有构造函数;不同类对其const数据成员的值可以不同,所以不能在类声明时初始化。...const成员函数:const对象不可以调用非const成员函数;非const对象都可以调用;不可以改变非mutable(用该关键字声明的变量可以const成员函数中被修改)数据的值。

    19220

    C++与Cconst关键字有何差别?

    前言 const关键字到底该怎么用》一文中介绍了C语言中的const关键字,本文说说C++const关键字,它的大部分特点和C语言中的类似,所以本文主要针对不同之处。...修饰普通变量--只读 C语言,虽然表面是不允许被修改,但是看下面的代码: #include int main(void) { const int a = 10; int...’ in read-only object a = 10; 正因如此,const修饰成员函数不与static关键字同用,因为static修饰的静态成员函数不能实例化,也就没有实例的成员变量一说...即下面的声明是非法的: static void printA() const 修饰类成员变量--构造函数初始化 与修饰普通变量不同的是,修饰类成员变量还可以构造函数初始化。...总结 关于const关键字C和C++的区别,想必到这里你已经清楚了。const关键字通常能借助编译器帮助我们提前发现一些不易察觉的问题。

    70600

    C++初阶】C++入门

    不是每个编译器都支持auto。 例: auto x = 7; //使用整数7对变量x进行初始化,可推断x为int型。...9、const、volatile const和volatile是类型修饰符,语法类似,用于变量或函数参数声明,也可以限制非静态成员函数。...structC++是特殊的类类型,声明仅默认隐式的成员和基类访问限定与class不同(struct是public,class是private)。union是联合体类型。...被mutable修饰的变量,将永远处于可变的状态,即使一个const函数。 22、namespace   C++标准程序库的所有标识符都被定义于一个名为std的namespace。...具有静态生存期的变量,只函数第一次调用时进行初始化没有显示初始化的情况下,系统把他们初始化微0. 28、sizeof 返回类型名或表达式具有的类型对应的大小。

    1.3K30

    C++语言基础篇(二)

    全局/静态存储区:分为初始化和未初始化两个相邻区域,存储初始化和未初始化的全局变量和静态变量。 常量存储区:存储常量,⼀般不允许修改。 代码区:存放程序的⼆进制代码。...3、C++ conststatic 关键字(定义,⽤途) static 作⽤:控制变量的存储⽅式和可⻅性。...作⽤四: 修饰类:如果 C++ 对类的某个函数⽤ static 修饰,则表示该函数属于⼀个类⽽不是属于此类的任何 特定对象;如果对类的某个变量进⾏ static 修饰,则表示该变量以及所有的对象所有...所以不能在类的声明初始化 const 数据成员, 因为类的对象没有创建时候,编译器不知道 const 数据成员的值是什么。const 数据成员初始化只能在类的构 造函数的初始化列表中进⾏。...成员变量如果想建⽴整个类 中都恒定的常量,应该⽤类的枚举常量来实现或者 static const

    59010

    从零开始学C++之从C到C++(一):const与#define、结构体对齐、函数重载name mangling、newdelete 等

    定义的一般形式: const 数据类型 常量名=常量值; 数据类型 const 常量名=常量值; 例如: const  float  PI=3.14159f; 注意事项: 常变量定义时必须初始化;...常变量初始化之后,不允许再被赋值; 正如我在这里所说,其实加了关键字const只是提示编译器这个变量是常量,如果我们接下来的操作中试图更改它,编译器会报错,而并不是真正的常量,事实上某些情形下通过指针也是可以更改的...(编译器报警告),什么情况下完全不能修改呢,当A是加const限定且初始化的全局变量,此时A位于.rodata段(linux 下)。...C、C++语言非常灵活,它允许你干涉“内存对齐” 为什么要对齐 性能原因:在对齐的地址上访问数据快。...(四)、域运算符 C++增加的作用域标识符 :: 用于对与局部变量同名的全局变量进行访问 用于表示类的静态成员,以后讲到类的时候再详谈 (五)、new、delete 运算符 (1)、new

    1.2K00

    C++ Primer Plus 第03章 数据处理 学习笔记

    要知道系统整数的最大长度,可以使用C++工具来检查类型的长度。 首先使用sizeof运算符返回类型或变量的长度,单位为字节。 climits包含符号常量(预处理方式)来表示类型的限制。...大括号内也不包含任何东西。此时变量初始化为零。 变量初始化的问题,有助于防范类型转换错误。 1.5 无符号类型 优点:可以增大变量能够存储的最大值。...句点被称为成员运算符*/ std::cout << std::endl; return 0; } 成员函数cout.put() ———— C++ OOP概念成员函数,成员函数归类所有...C++将非零值表示为true,将零表示为false。 bool is_ready = true; 2. const限定符 符号名称指出了常量表示的内容。 const关键字来修改变量声明和初始化。...强制转换的通用格式如下: (typename) value //来源于C语言 typename (value) // C++ 4.4 C++11的auto声明 初始化声明,如果使用关键字auto

    82700

    C++面试题

    #define主要是用于定义宏,编译器编译时做相关的字符替换工作,主要用来增加代码可读性;const定义的数据程序开始前就在全局变量区分配了空间,生命周期内其值不可修改;static修饰局部变量时,该变量便存放在静态数据区...程序变量可以声明多次,但只能定义一次。 5. volatile 和 mutable 有什么作用 C++,mutable是为了突破const的限制而设置的。...被mutable修饰的变量,将永远处于可变的状态,即使一个const函数,甚至结构体变量或者类对象为const,其mutable成员也可以被修改。...C++的顶层const和底层const? 顶层 const 表示指针本身是个常量; 底层 const 表示指针所指的对象是一个常量。 12. 拷贝初始化、直接初始化、列表初始化?...指定的数值和该成员大小较小那个的整数倍。

    1.7K42

    《Effective C++》读书笔记(一):让自己习惯C++(条款01~04)

    2.2 使用enum替换#define的缘由 类静态整型常量一些编译器不允许初始化的,但是当我们需要在类中使用这个常量的时候。...条款04的重要三个点: ①最好对类成员变量进行初始化,即使用初始化列表初始化构造函数的主体内,那不是初始化,那叫赋值。...顺带提一嘴,对于conststatic成员变量,就必须在初始化列表初始化。自定义类型会调用它的构造函数,内置类型或内置型对象必须手工初始化。...②初始化列表的初始化顺序是按照成员变量声明时的顺序来的,并非是初始化列表的顺序!...③跨编译单元的初始化次序问题: 不同编译单元定义的non-loacl static对象的初始化次序C++没有明确的定义。什么意思呢?

    21010

    c++入门】引用详解 | auto的类型推导 | 范围for循环 | nullptr空指针

    ☁️常引用 C++,常引用是指在函数参数列表或变量声明中使用const关键字来修饰的引用。常引用的作用是限制对被引用对象的修改。...如果需要引用非常量对象并且不允许修改该对象的值,可以使用const修饰符来声明常量对象。 ☁️使用场景 ⭐做参数 没有引用前,我们交换两个变量的值需要使用指针来完成。现在可以使用引用来完成了。...(vs2022下不会立即空间清除) 但是如果加上了static修饰就会不一样,因为被static修饰的变量是静态变量,是放在静态区上的,而不是栈上,并且由于static修饰的静态的变量只能被初始化一次...给大家详细讲解 ️指针空值(nullptr) 良好的C/C++编程习惯,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现 不可预料的错误,比如未初始化的指针。...NULL 被定义为一个整数常量 0。 C++ ,也可以使用 NULL 来表示空指针,但更推荐使用更加类型安全的 nullptr。

    21410

    C++的单例模式为什么不直接全部使用static,而是非要实例化一个对象?

    开场 前段时间我知乎回答了这样一个问题: 为什么C++单例模式不能直接全部使用 static变量static函数呢?如果全部使用 static的话,是不是也不会有多线程的问题了?...那么为什么Meyers推荐的是第一种的呢? 原因是这解决了一类重要问题,那就是static变量初始化顺序的问题。...C++只能保证同一个文件声明的static变量初始化顺序与其变量声明的顺序一致。但是不能保证不同的文件static变量初始化顺序。...这个未初始化可能产生的风险指的是C++变量的未初始化,而不是说配置文件未加载的之类业务逻辑上的未初始化导致的问题。...讲到这,我们对Meyers' Singleton的盲目鼓吹也需冷静一下,因为C++同样能保证所有文件内(非函数内)的static变量main()函数开始运行之后肯定是都能做完初始化的。

    1.3K20

    《逆袭进大厂》之C++篇49问49答(绝对的干货)

    C++,允许有相同的函数名,不过它们的参数类型不能完全相同,这样这些函数就可以相互区别开来。而这在C语言中是不允许的。也就是C++可以重载,C语言不允许。...24、C++conststatic的作用 static 不考虑类的情况 隐藏。...定义时要分配空间,不能在类声明初始化,必须在类定义体外部初始化初始化时不需要标示为static;可以被非static成员函数任意访问。...static成员函数:不具有this指针,无法访问类对象的非static成员变量和非static成员函数;不能被声明为const、虚函数和volatile;可以被非static成员函数任意访问 const...,所以不能在类声明时初始化 const成员函数:const对象不可以调用非const成员函数;非const对象都可以调用;不可以改变非mutable(用该关键字声明的变量可以const成员函数中被修改

    2.6K40

    基础知识_Cpp

    列表初始化 4.8. decltype作用以及与auto区别。 Cpp基础知识与常见问题。 基础语法 static关键字 修饰全局变量堆区分配内存;默认初始化为零;限定作用域为当前文件。...修饰局部变量时,堆区分配内存;只有首次定义时被初始化,直到程序运行结束才释放;作用域为局部作用域。 修饰普通函数,不能修改任何非static对象;该函数的作用域为当前文件 。...C++static关键字的总结 const关键字 特性:(1)被修饰的对象不是常量,是一个只读变量(不能放在case关键字后面也说明const不是一个常量);(2)定义时赋值,之后不允许修改。...mutable关键字 如果需要在const成员方法修改一个成员变量的值,那么需要将这个成员变量修饰为mutable。即用mutable修饰的成员变量不受const成员方法的限制。...指针和引用的区别 指针也是一个变量,里面存储的内容是一个地址。而引用本质上是一个常量指针,引用只允许初始化,不能再修改。 编译指针和引用的代码,汇编上是一样的:c++,引用和指针的区别是什么?

    2K30

    《逆袭进大厂》之C++篇49问49答

    C++,允许有相同的函数名,不过它们的参数类型不能完全相同,这样这些函数就可以相互区别开来。而这在C语言中是不允许的。也就是C++可以重载,C语言不允许。...24、C++conststatic的作用 static 不考虑类的情况 隐藏。...定义时要分配空间,不能在类声明初始化,必须在类定义体外部初始化初始化时不需要标示为static;可以被非static成员函数任意访问。...static成员函数:不具有this指针,无法访问类对象的非static成员变量和非static成员函数;不能被声明为const、虚函数和volatile;可以被非static成员函数任意访问 const...不考虑类的情况 const常量定义时必须初始化,之后无法更改 const形参可以接收const和非const类型的实参,例如 考虑类的情况 const成员变量:不能在类定义外部初始化,只能通过构造函数初始化列表进行初始化

    2K10

    《逆袭进大厂》第二弹之C++进阶篇59问59答(超硬核干货)

    static变量的记忆功能和全局生存期)存储静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。...4) static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝; 5) static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量...数据成员const数据成员,但不可以访问const对象的任意数据成员; 8) 一个没有明确声明为const成员函数被看作是将要修改对象数据成员的函数,而且编译器不允许它为一个const对象所调用...1、 动态数组管理new一个数组时,[]必须是一个整数,但是不一定是常量整数,普通数组必须是一个常量整数; 2、 new动态数组返回的并不是数组类型,而是一个元素类型的指针; 3、 delete[]时...如果有多个基类,则构造函数的调用顺序是某类类派生表中出现的顺序,而不是它们成员初始化的顺序。 ② 成员类对象构造函数。

    2.3K40

    面试总结-C++

    起到了隐藏的作用 类的 static 成员变量属于整个类所拥有,对类的所以对象只有一份拷贝 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的 static...当类存在const或者引用时成员变量时,必须使用初始化表。...构造函数和析构函数中都不要调用虚函数也是这个道理。 ### 成员变量成员函数 1.静态成员变量是需要初始化 其实这样说的是有点问题的,应该是静态成员是需要定义的。...《c++primer》里面说类外定义和初始化是保证static成员变量只被定义一次的好方法。...但static const int就可以类里面初始化 class Base{ public: static int class_p; //只有声明,而没有定义,不能直接调用

    2.1K11
    领券