类作用域及域内枚举
类作用域是C++引进的一种在类中的作用域,比如类成员函数就要用 :: 域作用符调用,比如类stock
class stock
{
private :
std :: string company;
long shares;
double share_val;
double total_val;
void set_tot()
{
total_val = shares * share_val;
}
public :
stock();
~stock();
stock(const std :: string & co , long n = 0 , double pr = 0.0 ) ;
void acquire(const std :: string &co, long n , double pr);
void buy(long num , double price);
void sell(long num , double price);
void update(double price);
void show() const;
const stock& topval(const stock& s) const;
};
我要定义show()函数,应该是在stock这个类下定义,用::完成这个在类作用域定义
void stock :: show () const
{
std :: cout.precision(5);
std :: cout << "Company :" << company
<< " Shares :" << shares << '\n'
<< "Share Price : $" << share_val
<< " Total Worth: $" << total_val << '\n';
}
域内枚举
非静态变量在类中是没有存储值的空间,比如我需要在类中需要使用一个值为12的常量
class Bakery
{
private:
const int mounts = 12;
double Array[mounts];
};
这样编译器会报错,因为没有空间放mounts这个值,导致数组不能生成和初始化
利用枚举就可以决绝这个问题
class Bakery
{
private:
enum {mounts = 12};
double Array[mounts];
};
在上面这个类中,mounts只是个普通的符号,并没有生成枚举变量,类似于c语言中的宏定义,是不占有空间,在类作用域这个空间中就是将mounts替换为12而已,如果需要两组枚举怎么办?
class Bakery
{
private:
enum food {mounts = 12};
enum juice {mounts = 12};
};
如果按照以上定义的话,就会产生歧义,因为两个枚举值是同样的,C++11中提供了一种新的枚举值,其枚举的作用域是类,声明如下:
class Bakery
{
private:
enum class food {mounts = 12};
enum class juice {mounts = 12};
};
在一些情况下,常规的枚举值,比如enum food {mounts = 12}中的mounts是可以自动转换为整形,将值复制费整形或者用于比较表达式的时候就可以自动转换为整形,但是新枚举类型enum class food {mounts = 12}中的mounts是不会转换为整形的,要通过一个强制转换才可以…
所以说
class Bakery
{
private:
enum class food {mounts = 12};
enum class juice {mounts = 12};
int Array[int(food::mounts)];
};
这个类才可以编译成功…