C++:类作用域(第十章)

第十章笔记链接:
类作用域
this指针和对象数组
构造函数和析构函数
面向对象、抽象和类

类作用域

之前介绍的作用域有:

  1. 全局(文件)作用域
  2. 局部(代码块)作用域
  3. 函数名称作用域(全局)
    类作用域
  1. 在类中定义的名称(类数据成员名和类成员函数名)的作用域都为整个类。
  2. 类作用域意味着不能从外部直接访问类的成员。
    调用公有成员函数必须通过对象,
    定义成员函数必须通过作用域运算符::,否则是不能识别的。
    使用类成员名,根据上下文选择用直接成员运算符. 、间接成员运算符-> 、 作用域解析运算符::

作用域为类的常量

不可以直接在类声明中定义const int Months =12 等来定义类常量,因为类声明只是描述对象的形式,并没有创建变量。

class A{
    const int Months =12;
    int cost [Months] ;
    ...}
//这样行不通

现有两种方式创建类常量:

  1. 在类声明中使用枚举
enum {Months=12};

声明枚举并不会创建类数据成员名,Months只是一个符号常量,编译器遇到它会自动转换为12;

  1. 在类声明中使用static关键字
static const int Months = 12;

创建的静态变量将和其他静态变量存储在一起而不是存储在对象中,可被所有类对象共享。

作用域内枚举

若有两个枚举在同一类中(表示鸡蛋大小和衣服大小)

enum egg { Small , Medium, Large , Jumdo};
enum clothes {Small , Medium, Large , XXL};

因为egg和clothes在同一个作用域内,所以会发生错误。解决方法就是创建类中类(就比如同一个屋子里的房间,一个屋子里有两个叫A的,你说屋子里的A不晓得是哪过,但你说房间1的A和房间2的A就可以区别了)。
限定枚举量,可以用class或struct:

enum class egg{Small , Medium, Large , Jumdo};
enum struct clothes{Small , Medium, Large , XXL};
egg A= egg::Small;
clothes B = clothes::Medium

这样就可以继续编写项目了,A是egg枚举的Small,B是clothes枚举的Medium.

在有些情况下,常规枚举将自动转换为整型。但作用域内枚举不能隐式地转换为整型。可以进行显示转换。

enum egg {Small, Medium, Large, Jumdo};           未限定枚举
enum class clothes{Small, Medium, Large, XXL};    限定枚举
egg A = Small;                         未限定枚举,不用作用域解析运算符
clothes B = clothes:: Small;           限定枚举,用作用域解析运算符
int King = A;                          可以,隐式类型转换
int Ging = B;                          不可以,没有进行隐式转换

未限定枚举可以进行隐式类型转换,而限定枚举不会进行类型转换。可以用显示类型转换。

int Ging = int(clothes:: Small)

也可以用底层类型转换:

enum class : int clothes {Small, Medium, Large, Jumdo } ;

这样子clothes底层类型被设置为int。

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