第十章笔记链接:
类作用域
this指针和对象数组
构造函数和析构函数
面向对象、抽象和类
类作用域
之前介绍的作用域有:
- 全局(文件)作用域
- 局部(代码块)作用域
- 函数名称作用域(全局)
类作用域
- 在类中定义的名称(类数据成员名和类成员函数名)的作用域都为整个类。
- 类作用域意味着不能从外部直接访问类的成员。
调用公有成员函数必须通过对象,
定义成员函数必须通过作用域运算符::,否则是不能识别的。
使用类成员名,根据上下文选择用直接成员运算符. 、间接成员运算符-> 、 作用域解析运算符::
作用域为类的常量
不可以直接在类声明中定义const int Months =12 等来定义类常量,因为类声明只是描述对象的形式,并没有创建变量。
class A{
const int Months =12;
int cost [Months] ;
...}
//这样行不通
现有两种方式创建类常量:
- 在类声明中使用枚举
enum {Months=12};
声明枚举并不会创建类数据成员名,Months只是一个符号常量,编译器遇到它会自动转换为12;
- 在类声明中使用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。