在类中声明变量/常量时,经常会用到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. 通过u盘启动盘重装系统

    前言:一直想通过u盘启动盘给旧本装个win7,但是发现网上完整的教程很少.这里分享给大家我重装的一些步骤和遇到的问题. 前期准备: 1.我们要准备一个容量在4G以上的U盘. 2.我们要将U盘中的重要数 ...

  2. nginx+php+swoole安装记录

    领了台阿里服务器1vCPU 1G,做下测试研究. 系统 centos7,使用yum安装. Nginx yum install nginx ##开启nginx service nginx start 安 ...

  3. C#网络编程(一)基础篇

    简介: C#网络编程API包含在System.Net和System.Net.Sockets命名空间下,大部分网络操作都可以在其中找到相应的类来实现:包括Socket的创建和连接,网络流收发方法的封装, ...

  4. 021.8 properties(开发使用频率高)

    内容:Properties基本存取.存储到持久化设备.从持久化设备读取.简单模拟收费软件试用结束##Properties——有配置文件的功能.    特点:    1.Hash table的子类,ma ...

  5. BZOJ1014:[JSOI2008]火星人(Splay,hash)

    Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam, 我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 ...

  6. 【【模板】严格次小生成树[BJWC2010]】

    树上的路径怎么能没有树剖 显然,次小生成树和最小生成树只在一条边上有差距,于是我们就可以枚举这一条边,将所有边加入最小生成树,之后再来从这些并不是那么小的生成树中找到那个最小的 我们往最小生成树里加入 ...

  7. PHP------TP命名空间

    命名空间: 相当于一个虚拟的目录 正常管理文件使用文件夹--物理区分 TP框架的初始命名空间是:ThinkPHP\Library 在TP框架下命名空间里面使用\代表的是初始命名空间(ThinkPHP\ ...

  8. Kali-linux Gerix Wifi Cracker破解无线网络

    Gerix Wifi Cracker是另一个aircrack图形用户界面的无线网络破解工具.本节将介绍使用该工具破解无线网络及创建假的接入点. 9.3.1 Gerix破解WEP加密的无线网络 在前面介 ...

  9. QTP基本方法4------手动写入信息到测试结果报告中

    可以使用写代码的方式添加结果信息到测试结果报告中. 结构:reporter.ReportEvent result,object,details,path result:状态:4种状态:micPass. ...

  10. 使用iptables和tc对端口限速

    首先,我们来看一下tc,TC(Traffic Control)命令,是linux自带的告警流控命令.Linux操作系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制, ...