在类中声明变量/常量时,经常会用到static、const关键字。对于该变/常量的初始化问题,网上有许多相关文章,但是大多不够完善,或者存在错误。经过实际验证,总结如下:

(注明:测试编译平台为VS2015和2010)

   class TestClass
{
public:
TestClass()//:a(16)
{
cout << "TestClass Constructor ." << endl;
}
~TestClass()
{
cout << "TestClass Destructor ." << endl; } int temp_a; // = 5;
static int temp_b;
const int temp_c; // = 25;
const static int temp_d; // = 35;
const static float temp_e;
};

int temp_a;

1、在声明处初始化;

2、在构造函数初始化列表中初始化;

对于非static、非const声明的变量,这两种初始化可以同时使用,同时使用时列表中的值会自动覆盖声明处的值。初始化不是必须的,若不进行初始化,其值是不确定的,可简单认为是随机的。该变量属于对象。

static int temp_b;

必须在类的声明体外进行定义(若在定义时不给初值,则编译器自动赋予默认值,int型变量的默认值为0),定义时不使用关键字static。例如:int TestClass::temp_b = 12;

该变量属于类,不属于特定的对象,可以理解为全局的,为所有所实例化的对象所共享。可在程序中通过类名作用域符号的方式访问(如:TestClass::temp_b = 18;),也可以通过对象访问。

const int temp_c;

1、在声明处初始化;

2、在构造函数初始化列表中初始化;

必须初始化,这两种初始化可以同时使用,同时使用时构造函数初始化列表中的值会自动覆盖声明处给的初值。

该常量属于对象,在对象声明时进行初始化,对象声明以后就不能再改变常量的值,即在对象的生存周期内其值不变。

const static int temp_d;//char  short  int  long

1、在声明处初始化;(在声明处初始化,则可以不用在类的声明体外进行定义)

2、在类的声明体外进行定义并初始化;const int TestClass::temp_d = 15;

必须初始化,并且只能有一次初始化赋值(即1和2中,二选一)。char、short、long型静态常量都属于这种情况。

静态常量属于类,为所有的对象共享,既然是常量,初始化以后肯定就不能再有赋值操作。

const static float temp_e; //float  double

只能且必须在类的声明体外进行定义和初始化   const  float TestClass::temp_e  = 0.234f;   静态常量的浮点型数据属于这种情况。

简单总结一下:

1、仅仅有关键字const,由于是常量,就必须进行初始化;可在声明处和构造函数列表中进行初始化,可以二选一,亦可以在这两处都初始化,初始化列表中的赋值会自动覆盖声明处的值。

2、仅仅有static,由于是静态变量,属于类本身,则必须在类的生命体外进行定义(若不给初值,则为默认值)

3,同时又static和const,这两个关键字的前后顺序无所谓,由于是静态常量,即同时具有静态和长常量的属性,使用条件就更加苛刻(即为一个常量,那就必须有初始化,并且还是静态的,那就自然属于类本身了)。整形数据可以在声明处初始化或者在类的声明体外进行定义并初始化,二选一。浮点型数据只能且必须在类的声明体外进行定义并初始化。

仅在VS平台进行了测试,若有不对之处,敬请指正,希望多多交流,共同进步。

C++ —— 类中static和const关键字声明变量的初始化方式总结的更多相关文章

  1. 类中被final修饰的成员变量需要初始化

    类中被final修饰的成员变量需要初始化,否则编译不通过,因为final修饰后不能再赋值,因此必须初始化.

  2. C++中static和const关键字的作用

    static关键字至少有下列几个作用: 函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值: 在模块内的static全局变量 ...

  3. PHP5中Static和Const关键字

    (1) static static要害字在类中是,描述一个成员是静态的,static能够限制外部的访问,因为static后的成员是属于类的,是不属于任何对象实例,其他类是无法访问的,只对类的实例共享, ...

  4. 【转】C++ 类中的static,const,及引用类型的初始化

    文档主要来自:http://blog.csdn.net/yjkwf/article/details/6067267 1. static类型 用static可以为类类型的所有对象所共有,像是全局对象,但 ...

  5. C++中static、const使用方法简介

    众所周知,在c++中,static和const的使用方法是难点,也是重点,值得我们随时温习,所谓温故而知新是也. 下面我们首先说一说static. 1.static的作用 static变量的作用,主要 ...

  6. C++ 中 static 与 const 的用法及对比

    在这个学习过程中我对 static 及 const 的使用时常会混淆,因此整理,加深记忆 一.类的静态成员 如果某个属性为整个类所共有,不属于任何一个具体对象,则采用 static 关键字来声明静态成 ...

  7. 【C++基础】 类中static private public protected

    静态成员在一个类的所有实例间共享数据 “类属性”,是描述类的所有对象共同特征的一个数据项,对所有对象,它的值相同,static定义,为整个类所共有.相对于“实例属性” 如果static成员是私有类型, ...

  8. javascript中var let const三种变量声明方式

    javascript中var let const三种变量声明方式 1.var  ①var表示声明了一个变量,并且可以同时初始化该变量. ②使用var语句声明的变量的作用域是当前执行位置的上下文:一个函 ...

  9. java 类中 static 的使用

    在类中 static 主要修饰变量,方法及代码块.大致的执行和使用,据个人理解如下: 1.修饰变量: 在修饰变量时,如 ,表示该变量是静态变量,也可称为类变量.当当前变量是静态变量时,该变量被该类的所 ...

随机推荐

  1. 使用TFHpple解析html

    使用TFHpple解析html https://github.com/topfunky/hpple 前期准备工作 引入静态库文件 添加库文件的 header search paths(注意,必须选中 ...

  2. EF学习之CodeFirst(二)--数据迁移

    使用CodeFirst时,如果Model发生改变的话,例如我们给User类里面新加个Sex属性,运行时会出现如下错误: 这时我们需要使用数据迁移来将model的改变同步更新到数据库中. 1.启用数据迁 ...

  3. Visual Studio 2017 连接Oracle

    VS 2017 连接 Oracle 12 因为Visual Studio自带的数据文件已经不能支持超过10g以上的了,所以需要另外 下载插件 本机环境 宿主机的环境:win7,Visual Studi ...

  4. 沉淀再出发:jetty的架构和本质

    沉淀再出发:jetty的架构和本质 一.前言 我们在使用Tomcat的时候,总是会想到jetty,这两者的合理选用是和我们项目的类型和大小息息相关的,Tomcat属于比较重量级的容器,通过很多的容器层 ...

  5. [BZOJ 1552] 排序机械臂

    Splay大法是坠吼滴! 1552: [Cerc2007]robotic sort Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 436  Solved: ...

  6. 020.2.5 Calender对象

    内容:日历对象获取时间,设置时间,日期偏移 通过工厂化获得对象.getInstance();get() 获取时间信息 Calendar c = Calendar.getInstance(); //获取 ...

  7. 如何实现本机Windows连接虚拟机中的CentOS

    1.确定CentOS的IP地址,命令为 ifconfig,由此可知,LinuxIP地址为 192.168.85.128 2.WIndows的IP地址为192.168.16.1, 3.保证CentOS和 ...

  8. VirtualBox操作总结

    1. VirtualBox安装 下载rpm,rpm -ivh 安装 2. 在图形界面打开virtual box virtualbox 3. vboxmanage打开虚拟机 vboxmanage sta ...

  9. Controller如何写的更简化

    Controller层相当于MVC中的C,也是安卓或者前端请求的接口. 首先说Controller为什么需要写的更加简化? 第一.Controller是不能复用的: 第二.即便是将Controller ...

  10. WPF实战俄罗斯方块

    概述 本文试图通过经典的游戏-俄罗斯方块,来演示WPF强大的图形界面编程功能. 涉及的图形方面有这几个方面: 1.不规则界面的设置 2.布局系统的使用 3.2D图形的应用 4.输入事件的响应 5.风格 ...