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

C++中类中常规变量、const、static、static const(const static)成员变量的声明和初始化的更多相关文章

  1. 继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程

    继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的 ...

  2. Java 访问限制符 在同一包中或在不同包中:使用类创建对象的权限 & 对象访问成员变量与方法的权限 & 继承的权限 & 深入理解protected权限

    一.实例成员与类成员 1. 当类的字节码被加载到内存, 类中类变量.类方法即被分配了相应内存空间.入口地址(所有对象共享). 2. 当该类创建对象后,类中实例变量被分配内存(不同对象的实例变量互不相同 ...

  3. 41-ssm中对象查找正确但是没有将数据库中某个属性值赋给对象的一个成员变量

    原因: 变量名虽然与 数据库字段一致,但是 包含下划线,如: a_b,数据库确实也是a_b: 但是ssm开启驼峰命名了,就要将变量名改为   aB , 驼峰命名就可以了.

  4. 继承时,当父子类都具有相同的成员变量,默认情况下是直接调用子类的成员变量,当要调用父类的成员变量则需要使用super关键之

    package day02; public class Person { String name="fl"; }class Car{ }class Student extends ...

  5. 【C++】const,static和static const类型成员变量声明及其初始化

    1)const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间 void f1() { ; cout<<x<<endl; ...

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

    C++ static.const和static const 以及它们的初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. sta ...

  7. JAVA中的static关键字(静态变量和成员变量)

    static的特点: 1.static是一个修饰符,用于修饰成员: 2.static修饰的成员被所有的对象所共享: 3.static优先于对象存在,因为static的成员随着类的加载就已经存在了: 4 ...

  8. Java中Static关键字详解以及静态变量和成员变量的区别

    一.static关键字的特点 (1)修饰成员变量.成员方法(2)随着类的加载而加载(3)优先于对象存在(4)被所有对象共享(5)可以通过类名调用 它本身也可以通过对象名调用 例如:main()方法由j ...

  9. 为什么static成员必须在类外初始化,而不能在类的头文件中初始化

    为什么static成员必须在类外初始化 为什么静态成员不能在类内初始化 在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样.   class A { pri ...

随机推荐

  1. linux命令集锦 基于centos7---优化linux的命令

    sed -i ‘s###g’ /etc/selinux/config  3个# 用于更改selinux配置文件:sed -i 's#SELINUX=enforcing#SELINUX=disabled ...

  2. 【Python之路】特别篇--事件驱动与异步IO

    通常,我们写服务器处理模型的程序时,有以下几种模型: (1)每收到一个请求,创建一个新的进程,来处理该请求: (2)每收到一个请求,创建一个新的线程,来处理该请求: (3)每收到一个请求,放入一个事件 ...

  3. Java进阶知识05 Hibernate联合主键之Annotation(注解)和XML实现方式

    1.Hibernate联合主键(Annotation实现) 1.1.单列主键 1.1.1.为什么要有主键? //唯一确定一条记录    1.1.2.一个表能否有多个主键? //不能    1.1.3. ...

  4. delphi请求http接口并上传附件

    实现附件的上传:需要使用TIdMultiPartFormDataStream控件, uses IdMultipartFormData; 例子: procedure TClientForm.Button ...

  5. Mysql主从同步 异常Slave_SQL_Running: No

    在刚搭建好的mysql主从节点上对从节点进行操作,导致同步异常:报错如下: 从节点执行: mysql> show slave status\G;************************* ...

  6. 服务不支持 chkconfig 的解决办法

    在chkconfig --add servername的时候老是提示服务不支持 chkconfig 经过查找,解决办法如下. 1.脚本tomcatstart前三行如下: #!/bin/bash #ch ...

  7. weblogic漏洞总结 复现(未完)

    复现方式 Docker复现 WEBlogic爆出了很多漏洞 先了解一下现在主流的版本 Weblogic 10.3.6.0 Weblogic 12.1.3.0 Weblogic 12.2.1.1 Web ...

  8. iOS8-Sampler

    https://github.com/shu223/iOS8-Sampler iOS8-Sampler Code examples for the new functions of iOS 8. Ho ...

  9. badboy——jmeter录制工具

    web网站录制工具 输入网址:红点点被选中代表在录制,然后点点点: 然后导出: 在从JMETER打开:(注意,一定要填cookie)

  10. BAT 鼎立格局被打破,2019 年这些互联网公司是程序员跳槽首选!

    点击上方“程序员江湖”,选择“置顶或者星标” 你关注的就是我关心的! ​ 作者:BOSS直聘 来源:BOSS直聘 作者:BOSS直聘(ID:bosszhipin),领先的移动互联网招聘APP,为求职者 ...