【C++】学习笔记五十——类作用域
来源:互联网 发布:卡尔顿乳酪面包淘宝 编辑:程序博客网 时间:2024/06/06 09:29
类作用域
在类中定义的名称(数据成员名和成员函数名)的作用域都为整个类,作用于为整个类的名称只在该类中是已知的,在类外是不可知的。因此,可以在不同类中使用相同的类成员名而不会引起冲突。
类作用域意味着不能从外部直接访问类的成员,公有成员函数也是如此。也就是说,要调用共有成员函数,必须通过对象。
在类声明或成员函数定义中,可以使用未修饰的成员名称。构造函数名称在被调用时,才能被识别,因为它的名称与类名相同。在其他情况下,使用类成员名时,必须根据上下文使用直接成员运算符(.)、间接成员运算符(->)或作用于解析符(::)。
作用域为类的常量
在类中直接声明常量是不可行的:
class Bakery{private: const int Months = 12; //无效 double costs[Months]; ...
因为声明类只是描述了对象的形式,并没有创建对象。
有两种方式可以实现这个目标:
第一种是在类中声明一个枚举。
在类声明中声明的枚举的作用域为整个类,因此可以用枚举为 整型常量 提供 作用域为整个类 的符号名称:
class Bakery{private: enum {Months =12}; double costs[Months]; ...
注意:用这种方式声明枚举并不会创建类数据成员。也就是说,所有对象中都不包含枚举。Months只是一个符号名称,在作用域为整个类的代码中遇到它时,编译器用12来替换它。
在很多实现中,ios_base类在其公有部分中完成了类似的工作,诸如ios_base::fixed等标识符就来自这里。fixed是ios_base类中定义的典型的枚举量。
第二种方式是使用关键字static:
class Bakery{private: static const int Months = 12; double costs[Months]; ...
这将创建一个名为Months的常量,该常量与其他静态变量存储在一起,而不是存储在对象中。因此,只有一个Months常量,被所有Bakery对象共享。
作用域内枚举(C++11)
传统的枚举存在一些问题,其中之一是两个枚举定义中的枚举量可能发生冲突。
假设一个程序包含下面的代码:
enum egg {Small, Medium, Large, Jumbo};enum t_shirt {Small, Medium, Large, Xlarge};
这将无法编译通过,因为egg Small和t_shirt Small位于相同的作用域内,它们将发生冲突。
为避免这种问题,C++11新增了一种枚举,其枚举的作用域为类:
enum class egg {Small, Medium, Large, Jumbo};enum class t_shirt {Small, Medium, Large, Xlarge};
也可以用struct代替class。
这种方式需要使用枚举名来限定枚举量:
egg choice = egg::Large;t_shirt choice = t_shirt::Large;
C++11还提高了作用域内枚举的类型安全,在作用域内枚举不能隐式地将枚举量转换为整型。在必要时可进行显式转换:
int Frodo = int(t_shirt::Small);
C++11作用域内枚举的底层类型默认为int,也可指定底层类型(必须为整型):
enum class : short pizza {Small, Medium, Large, XLarge}; //指定底层类型为short
- 【C++】学习笔记五十——类作用域
- OpenCV学习笔记(五十)——Algorithm类介绍(core)
- OpenCV学习笔记(五十)——Algorithm类介绍(core)
- OpenCV学习笔记(五十)——Algorithm类介绍(core)
- C语言学习笔记——指针的作用
- Javascript学习笔记——作用域
- Python学习笔记——作用域
- C语言学习笔记——数据的类型、存储、作用域,运算符,表达式
- 【Objective-C学习笔记】核心语法——实例变量作用域、关键字@property和@synthesize
- 黑马程序员——IOS学习笔记(C语言存储方式和变量作用域)
- 【C++】学习笔记四十五——存储持续性、作用域、链接性
- JAVA学习笔记(五十)- JDBC Java数据库连接
- 日语五十音图学习笔记
- C学习笔记:变量作用域、链接属性、存储类型
- JavaWeb学习总结(五十)——文件上传和下载
- JavaWeb学习总结(五十)——文件上传和下载
- JavaWeb学习总结(五十)——文件上传和下载
- JavaWeb学习总结(五十)——文件上传和下载
- 自定义android日志管理工具LogUtil
- 已处理证书链,但是在不受信任提供程序信任的根证书中终止
- 2.3 利用DFT分析信号频谱
- c语言排序
- 线性表——链式存储结构之双链表的应用
- 【C++】学习笔记五十——类作用域
- 前端开发资源汇总
- 使用java awt 制作登陆,注册界面(结合数据库MY SQL )使用mac系统的eclipse
- python操作xlsx文档
- zoj1942
- ZOJ--1007:Numerical Summation of a Series
- 获取全局Context
- 554. Brick Wall
- 数据比赛资料(杂合)