一、作用域为类的常量

有些情况下,使符号常量的作用域为类很有用。如,类声明(不是定义)可能使用字面值30来指定数组长度,由于该常量对于所有对象来说都是相同的,因此创建一个由所有对象共享的常量是个不错的主意,也许我们想像下面这样做:

 class Weather
{
private:
const int Months = ; //声明一个常量
double temperature[Months];
...
}

要注意的是,我们这是在声明阶段,需要在声明类的时候就有一个字符常量可以供我们使用,但是也正因为我们处于声明阶段,类的声明只是描述一下类的形式,并不给数据成员分配任何值(可以想象函数声明来理解,只是告诉编译器,函数名字,参数的类型,几个参数,这都是来描述形式而已,并不会给参数赋值,类也是类似),真正给数据成员分配值是在用这个类创建一个对象的时候(就如同真正给函数参数分配值的时候是在调用该函数的时候),因为只有创建对象后,才会分配在一个空间给你存储对象数据,否则就没有这个存储空间,所以上述声明,虽然表面上给Months赋了一个值12,但是还没有创建对象,就没有存储值得空间(好比你对派出所声明你家将要出生一个小孩,但是在小孩真正出生之前,派出所是不会给“小孩”分配户口一样),于是,Months其实没有值,那么用一个没有的值来声明数组的大小,当然是不对的。

有问题,就有办法,有两种方式可以实现这个目标,效果相同。

第一种方法是在类中声明一个枚举。在类中声明(不是定义哦)的枚举的作用域为整个类,如下:

 class Weather
{
private:
enum {Months = }; //声明一个枚举
double temperature[Months];
...
}

有的读者会疑惑,不是说了,声明的时候不给数据成员分配值吗,怎么会这样?这也正是要注意的,用这种方式声明枚举不会创建类数据成员,也就是说在用这个类创建对象时,所有对象中都不包含枚举,Months只是一个符号名称,即一个符号常量(而不是变量),在类的作用域之内,代码遇见它时,编译器将用12来替换它。也许还有读者疑惑,符号常量不需要存储空间吗?事实上,就是不需要,所谓符号常量,就是用一个字符串来替换程序中出现的标识符,和宏定义类似,内存中没有以符号常量命名的存储空间,上述程序,就是遇见Months就替换为12而已。

第二种方法是使用关键字static:

 class Weather
{
private:
static const int Months = ;
double temperature[Months];
...
}

不是说好,声明时,对象没有创建,所以没地存放值吗?这就是static的特性,它声明的变量是不依赖于对象的,也就是说它不存储在对象的空间中,它与其他静态变量(static)存储在一起,也就是说这个变量属于这个类,而不是属于具体的对象,但是这个类创建的对象当然可以使用它,打个比方,staic声明的静态变量就好比你们村口的一口百年古井,你用或者不用它,它就在那里,它属于整个村的,而不是村里的某一个人,但是呢,村里的每一个人都可以在里面打水,它当然不需要派出所给它分配户口,哈哈……

 二、作用域内的枚举(C++11)

注:C++11是2011年创建的C++新标准,在C++98基础上做了改动而成。

传统的枚举存在一些问题,其中之一就是连个枚举中定义的枚举量可能发生冲突,如:

 enum egg {Small, Medium, Large, Jumbo};
enum t_shirt {Small, Medium, Large, Xlarge};

将无法通过编译,因为egg Small和t_shirt Small位于相同的作用域内,它们将发生冲突。C++11提供了一种新枚举,作用域为类,如:

 enum class egg {Small, Medium, Large, Jumbo};
enum class t_shirt {Small, Medium, Large, Xlarge};

也可使用关键字struct代替class. 无论哪种方式,都需要使用枚举名来限定枚举量:

 egg choice = egg::Large;         //the Large enumerator of the egg enum
t_shirt Floyd = t_shirt::Large; //the Large enumerator of the t_shirt enum

枚举量的作用域为类后,不同枚举定义中的枚举量就不会发生冲突了。

C++学习笔记之作用域为类的常量和作用域内的枚举的更多相关文章

  1. JVM学习笔记-第六章-类文件结构

    JVM学习笔记-第六章-类文件结构 6.3 Class类文件的结构 本章中,笔者只是通俗地将任意一个有效的类或接口锁应当满足的格式称为"Class文件格式",实际上它完全不需要以磁 ...

  2. java学习笔记07--日期操作类

    java学习笔记07--日期操作类   一.Date类 在java.util包中定义了Date类,Date类本身使用非常简单,直接输出其实例化对象即可. public class T { public ...

  3. Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  4. AJPFX学习笔记JavaAPI之String类

    学习笔记JavaAPI之String类 [size=10.5000pt]一.所属包java.lang.String,没有子类.特点:一旦被初始化就不可以被改变. 创建类对象的两种方式: String ...

  5. 并发编程学习笔记(10)----并发工具类CyclicBarrier、Semaphore和Exchanger类的使用和原理

    在jdk中,为并发编程提供了CyclicBarrier(栅栏),CountDownLatch(闭锁),Semaphore(信号量),Exchanger(数据交换)等工具类,我们在前面的学习中已经学习并 ...

  6. Python3+Selenium3+webdriver学习笔记12(js操作应用:滚动条 日历 内嵌div)

    #!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记12(js操作应用:滚动条 日历 内嵌div)'''from ...

  7. java学习笔记之日期日历类

    java学习笔记之日期日历 Date日期类概述: 表示特定的瞬间,精确到毫秒 Date类的构造方法: 1.空参数构造方法 Date date = new Date(); 获取到当前操作系统中的时间和日 ...

  8. 吴裕雄--天生自然C++语言学习笔记:C++ 存储类

    存储类定义 C++ 程序中变量/函数的范围(可见性)和生命周期.这些说明符放置在它们所修饰的类型之前.下面列出 C++ 程序中可用的存储类: auto register static extern m ...

  9. jvm的学习笔记:二、类的初始化,代码实战(2)

    常量在编译阶段,会存在调用这个常量的方法的所在的类的常量池当中 System.out.println(MyParent2.str); 输出: hello parent2 依据:在MyTest2类调用M ...

随机推荐

  1. jquery功能实现总结

    最近一直在做.net这方面的,也学习了jquery一些东西,其中实现了自动关闭页面,json解析字符串,拼接字符串,for循环,函数调用,等一些功能,自己也学习了,也希望可以帮助大家,大家看后给提提意 ...

  2. iOS学习笔记之Category

    iOS学习笔记之Category 写在前面 Category是类别(也称为类目或范畴),使用Category,程序员可以为任何已有的类添加方法.使用类别可以对框架提供的类(无法获取源码,不能直接修改) ...

  3. 腾讯2015校招一面、二面、HR面

    其实我目前的理想公司就是腾讯. 内推第三面跪了··· 现在校招. 已面完一面.二面.HR面··· 一面主要问我项目和Linux.网络··· 二面主要问我游戏服务器··· 然后是HR面··· 技术面我都 ...

  4. int型长度

    Ø  基本数据类型 C语言中只有4中基本数据类型——整型.浮点型.指针和聚合类型(如数组和结构等):所有其他类型都是从这4种基本类型的某种变化或组合派生而来. 一.整型家族 整型家族包括char.sh ...

  5. xdebug初步

    ;加载xdebug模块. 根据PHP版本来选择是zend_extension还是zend_extension_ts  ts代表线程安全  被坑过1次zend_extension="\web\ ...

  6. erlang常用命令

    1 erlang启动时就运行odbc erl -s odbc 2 ping 节点 net_adm:ping('rabbit@COMPUTERNAME'). 3 运行cmd命令 os:cmd(" ...

  7. 企业网管软件实战之SolarWinds LANsurveyor

    SolarWinds LANsurveyor是一款比较容易掌握的网络管理软件,他能自动探索你的LAN或WAN,并生成全面的,易于浏览的集成了OSI 2层和 3层 拓扑数据的网络图表.其主要功能有: 1 ...

  8. 第二百一十五、六天 how can I 坚持

    昨天刷机刷到很晚,博客都忘写了,刷了个flyme,用着没什么感觉,今天打电话试了下还有破音,有点小后悔.不行过两天再刷回来. 今天.mysql ifnull函数. 两条熊猫鱼都死了,这两天雾霾那么严重 ...

  9. Apache Spark是什么?

    简单地说, Spark是发源于美国加州大学伯克利分校AMPLab的大数据分析平台,它立足于内存计算,从多迭代批量处理出发,兼顾数据仓库. 流处理和图计算等多种计算范式,是大数据系统领域的全栈计算平台. ...

  10. <转载>浅谈C/C++的浮点数在内存中的存储方式

    C/C++浮点数在内存中的存储方式 任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100.则在Intel CPU架构的系统中 ...