作用域为类的常量
如果要在类里定义常量
#include<iostream>
#include<cstdio>
using namespace std;
class NODE
{
private:
int val;
const int p = 1;
};
int main()
{
return 0;
}
这样编译会报错(在C++11中是可允许的,但早期的版本不支持)。因为类声明只是描述了对象的形式,并没有创建对象。因此,在创建对象前,将没有用于存储值的空间。因此,如果是C++11之前的版本,可以加上static关键字来定义常量。
static const int p=1;
也可以用枚举类型。
作用域为类的枚举
在类中定义枚举
private:
enum{one=1};
在类中声明的枚举的作用域为整个类。但是用这种方式声明枚举并不会创建类数据成员。即所有对象中都不包含枚举,它只是一个符号名称。即在作用域中遇到one时,编译器用1来代替它。由于这里使用枚举只是为了创建符号常量,并不打算创建枚举类型的变量,因此不需要提供枚举名。
在声明相同的枚举变量时,会发生冲突。
private:
enum e1{one,two,three};
enum e2{ont,two,three};
可以在两个枚举前都添加class关键字或者只在一个枚举前添加class定义,加以区分。
class NODE
{
private:
enum e1 { one=1, two, three };
enum class e2 { one=2, two, three };
public:
int get_e1_one()
{
return one;
}
int get_e2_one()
{
return (int)e2::one;
}
};
加了class关键字的枚举,在需要用到它里的常量时,必须加枚举名加以限定。而且加了class之后,枚举名里的常量不能自动转换成int,必须强制转换。没class关键字的枚举则无这些限制。
枚举用某种底层整型类型表示。在C++98中,如何选择取决于实现,因此包含枚举的结构的长度随系统而异。在C++11中,对于类内的枚举,默认底层类型为int。