类作用域

作用域分为:全局(文件)作用域局部(代码块)作用域类作用域三种。

1.作用域为类的常量

1.在类中声明的枚举的作用于为整个类,用这种方式创建枚举并不会创建类数据成员,如下,
class Test { private: enum{Months = 1008611}; public: };

2.使用关键字static来创建,如下Months常量将于其它静态变量存储在一起,不是存储在对象中。因此只有一个Months常量被所有Test共享。,
static const int Months = 12;

2.作用域内枚举

传统的枚举,枚举量可能会发生冲突,即不同的枚举内不能有相同的枚举量,因为它们位于同一个作用域内。
如下图:

屏幕快照 2017-04-26 上午9.18.02.png

但是,如声明一种新枚举,其枚举量的作用于为类,如下:

enum class egg{pdd1,pdd2,pdd3};
enum class lol{pdd1,pdd2,pdd3};
enum struct lck{pdd1,pdd2,pdd3};

我们可以在枚举名前面加上class关键字,也可以使用struct来替代。但是无论使用那种方式,就要使用枚举名来限定枚举量,即如下样式:

egg lpl = egg::pdd3;
lol lspl = lol::pdd2;

这样在不同枚举内相同的枚举名就不会发生冲突了。
在C++11的标准中,还提高了作用域内枚举的类型安全。在有些情况下,比如将枚举赋值给int变量或用于比较表达式,常规枚举将自动转化为整型,但是,作用域内枚举(使用枚举名来限定枚举量之后)不能隐式地转化为整型,会报错。
如下:

    enum egg_old {Small , Large , XXL};
    enum class t_shirt {Small , Large , XXL};

    egg_old faker = Large;
    t_shirt ttt = t_shirt::Large;

    int lck = faker;//
    /*
    int lpl = ttt;
    ERROR: Cannot initialize a variable of type 'int' with an lvalue of type 't_shirt'
     */

    if (lck < Small) {
        //do something
    }

    /*
    if (ttt > XXL) {
        ERROR:Invalid operands to binary expression ('t_shirt' and 'int')
    }
     */

但是如果需要,可以进行强制的显式类型转换,如下:

    int lcs = int(t_shirt::Large);
    int lpl = int(ttt);
    if (int(ttt) > XXL) {

    }

枚举用某种底层整型类型表示时,在C++11标准中,默认的情况下作用内枚举的底层类型为int,但是也可以指定类型(前提必须是整型类型),如下,

enum class:short lpl { Small, Large, Jumbo,};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容