C++类有几种类型的数据成员:普通类型、常量(const)、静态(static)、静态常量(static const)。这里分别探讨以下他们在C++11之前和之后的初始化方式。

c++11之前版本的初始化

在C++11之前常规的数据成员变量只能在构造函数里和初始化列表里进行初始化。const类型的成员变量只能在初始化列表里并且必须在这里进行初始化。static类型只能在类外进行初始化。static const类型除了整型数可以在类内初始化,其他的只能在类外初始化。代码如下:

class A
{
public:A();~A();//int m_n1 = 10;                // 错误   1   error C2864: “A::m_n1”: 只有静态常量整型数据成员才可以在类中初始化int m_n2;int m_n3;//const int m_nConst_1 = 10;   // 错误    3   error C2864: “A::m_nConst_1”: 只有静态常量整型数据成员才可以在类中初始化const int m_nConst_2;const int m_nConst_3;const int m_nConst_4;// static int m_nStatic_1 = 10; // 错误   1   error C2864: “A::m_nStatic_1”: 只有静态常量整型数据成员才可以在类中初始化static int m_nStatic_2;static int m_nStatic_3;// static double m_dStatic_1 = 10.1;// 带有类内初始化表达式的静态数据成员,必须具有不可变的常量整形类型,或必须被指定为“内联”static double m_dStatic_2;static double m_dStatic_3;static const int m_nStaticConst_1 = 10;static const int m_nStaticConst_2;const static int m_nStaticConst_3;//static const double m_dStaticConst_1 = 10; // 错误  1   error C2864: “A::m_dStaticConst_1”: 只有静态常量整型数据成员才可以在类中初始化static const double m_dStaticConst_2;static const double m_dStaticConst_3;
};

源文件如下:

#include "Initialize.h"int A::m_nStatic_3 = 13; //类外初始化静态变量
// int A::m_nConst_4 = 13; 非静态数据成员不能在其类的外部定义
const int A::m_nStaticConst_3 = 12; // 类外初始化静态常量A::A():m_n3(12),m_nConst_2(11),m_nConst_3(12),m_nConst_4(13)//,m_dStaticConst_2(11.0)//, m_nStaticConst_3(12)// m_nStatic_3(13)// 不是类"A"的非静态数据成员或基类
{// 错误  4   error C2758: “A::m_nConst_1”: 必须在构造函数基/成员初始值设定项列表中初始化m_n2 = 11;// m_nConst_3 = 12;          // 表达式必须是可修改的左值// m_nStatic_2 = 12;         // 无法解析外部符号// m_dStatic_2 = 11.0;       // 无法解析外部符号// m_nStaticConst_2 = 11;    // 表达式必须是可修改的左值// m_dStaticConst_2 = 11.0;  // 表达式必须是可修改的左值
}A::~A()
{}

如下表:
| type |normal | const | static | static const |
| -- | -- | -- | -- | --|
| 在声明时初始化 | x | x | x | x(只有静态常量整型才可以) |
| 初始化列表初始化 | √ | √ | x | x |
| 构造函数里初始化 | √ | x | x | x |
| 类外初始化 | x | x | √ | √ |

C++11中初始化

在C++11中加入了类内初始化,常规的数据成员变量能在类内、构造函数里和初始化列表里进行初始化。const类型的成员变量只能在初始化列表里并且必须在这里进行初始化。static类型只能在类外进行初始化。static const类型除了整型数可以在类内初始化,其他的只能在类外初始化。代码如下:

class A
{
public:A();~A();int m_n1 = 10;int m_n2;int m_n3;double m_d1 = 10.0;const int m_nConst_1 = 10;const int m_nConst_2;const int m_nConst_3;const int m_nConst_4;// static int m_nStatic_1 = 10; // 带有类内初始化表达式的静态数据成员,必须具有不可变的常量整形类型,或必须被指定为“内联”static int m_nStatic_2;static int m_nStatic_3;// static double m_dStatic_1 = 10.1;// 带有类内初始化表达式的静态数据成员,必须具有不可变的常量整形类型,或必须被指定为“内联”static double m_dStatic_2;static double m_dStatic_3;static const int m_nStaticConst_1 = 10;static const int m_nStaticConst_2;static const int m_nStaticConst_3;//static const double m_dStaticConst_1 = 10; // E1591   "const double" 类型的成员不能包含类内初始值设定项static const double m_dStaticConst_2;static const double m_dStaticConst_3;
};

源文件代码如下:

int A::m_nStatic_3 = 13;
// int A::m_nConst_4 = 13; 非静态数据成员不能在其类的外部定义
const double A::m_dStaticConst_2 = 12.0;
A::A():m_n3(12),m_nConst_2(11),m_nConst_3(12),m_nConst_4(13)//, m_nStaticConst_3(12)// m_nStatic_3(13)// 不是类"A"的非静态数据成员或基类
{m_n2 = 11;// m_nConst_3 = 12;          // 表达式必须是可修改的左值// m_nStatic_2 = 12;         // 无法解析外部符号// m_dStatic_2 = 11.0;       // 无法解析外部符号// m_nStaticConst_2 = 11;    // 表达式必须是可修改的左值// m_dStaticConst_2 = 11.0;  // 表达式必须是可修改的左值
}A::~A()
{}

如下表:

type normal const static static const
在声明时初始化 x x x(只有静态常量整型才可以)
初始化列表初始化 x x
构造函数里初始化 x x x
类外初始化 x x

转载于:https://www.cnblogs.com/konglongdanfo/p/9135260.html

C++中类中常规变量、const、static、static const(const static)成员变量的声明和初始化...相关推荐

  1. 【Java基础】Java中类的初始化过程:(静态成员变量,静态代码块,普通成员变量,代码块初始化顺序)

    初始化过程是这样的: 1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化: 2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化: 3.其次,初始 ...

  2. 【笔记】Java中使用变量的规则(使用变量,遵循就近原则)、成员变量和局部变量的区别

    文章目录 一.使用变量的规则 二.成员变量和局部变量的区别 一.使用变量的规则 最终输出的是"小黑正在努力学习" 使用变量,遵循就近原则 例:将上述代码敲一遍 Student部分 ...

  3. python的类变量和成员变量用法_Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析...

    本文实例讲述了Python面向对象程序设计类变量与成员变量.类方法与成员方法用法.分享给大家供大家参考,具体如下: 类变量与成员变量 在类中声明的变量我们称之为类变量[静态成员变量], 在init() ...

  4. java private 变量_java 的private的用法保护成员变量的值,将值判断

    package day02;public class Private_yongfa { String name; private int age;//固定写法 String sex; public v ...

  5. 变量绑定对话框控件不同类型成员变量的绑定

    最近研究变量绑定,稍微总结一下,以后继续补充: cButton->EnableWindow(FALSE); 每日一道理 喜马拉雅直冲霄汉,可上面有攀爬者的旗帜:撒哈拉沙漠一望无垠,可里面有跋涉者 ...

  6. C++ static、const和static const类型成员变量声明及其初始化

    C++ static.const和static const类型成员变量声明及其初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. ...

  7. java中static、final、static final的区别

    总结一: final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final修饰的属性跟具体对象有关,在运行期初始 ...

  8. 我终于明白了!!!类、成员变量、方法、以及如何定义他们,还有static到底干啥用?

    今天是大年初五呀,迎财神的日子!最近一直都忙着背英语单词,刷韩老师的课程,看<Java疯狂讲义>.看书 最近看了几本关于自我成长不错的书籍,也慢慢摆脱了追求阅读速度的急切心理,有句话感觉说 ...

  9. 7 面向对象(成员变量和局部变量的区别,类作为形式参数的问题,匿名对象,封装,private关键字,this关键字,构造方法,类的初始化过程,static关键字)

    1:成员变量和局部变量的区别(理解) (1)在类中的位置不同 成员变量:类中方法外 局部变量:方法定义中或者方法声明上 (2)在内存中的位置不同 成员变量:在堆中 局部变量:在栈中 (3)生命周期不同 ...

  10. C++ 类中特殊的成员变量(常变量、引用、静态)的初始化方法

    <p style="line-height: 19px; margin: 10px auto; color: rgb(75, 75, 75); font-family: Verdana ...

最新文章

  1. 把DXF导入到Altium Designer的完美方法
  2. boost::shared_mutex相关的测试程序
  3. 获取某个日期是一年中的第几周
  4. 执行远程服务器上的脚本失败?(环境变量引起的问题)
  5. 9206-1121-对象数组
  6. C++ 设计模式 —— 策略模式(Strategy)
  7. 熊猫删除重复行– drop_duplicates()函数
  8. linux mint 8812ac网卡,kali虚拟机连接无线网卡comfast cf-812AC(Realtek 8812BU芯片)(不支持wlan0mon)...
  9. 极化码理论及算法研究5-SC算法及matlab仿真
  10. oracle字段名小写改大写,Oracle数据库中如何实现将将表中字段名转换为大写
  11. Discuz!开发之模板制作CSS扩展规范与语法规范
  12. 全面解析Sbo业务审批流程与结构
  13. 电影和电视Movies and TV
  14. web调用摄像头拍照并上传到服务器
  15. Photoshop支持ICO图片格式
  16. 黑苹果 之 神舟战神Z7M-SL7D2
  17. 广州智算科技有限公司前端面试题
  18. Web实验六 JavaScript实验
  19. nginx webdav配置
  20. Chosen by god 【组合数打表,快速幂,求逆元】

热门文章

  1. vs2008 jquery 智能提示
  2. 戴爾一體機欲與蘋果決高下
  3. 仿微信朋友圈图片按下效果
  4. 【Flutter】基础组件【07】Appbar
  5. MAC 电脑里面的“其他”文件是什么占用了
  6. 谈谈你对TCP三次握手和四次挥手的理解
  7. 修改spring Boot启动时的默认图案Banner
  8. AlwaysOn业务IP和高可用IP分开使用(四)
  9. 如何实现LBS轨迹回放功能?含多平台实现代码
  10. 安卓图片框架:universal-image-loader的高速使用