C++类常量和类枚举
作者:梁唐 发布时间:2022-05-05 17:07:47
文章转自公众号:Coder梁(ID:Coder_LT)
1.类常量
有的时候, 我们希望能给类当中定义一些常量,可以给所有类的对象使用。
比如说我们在类当中定义一个数组,希望可以定义一个常量,用来初始化数组的长度。既然是用来初始化数组长度的,那么这个值自然也不会改变,我们定义成const
是否可行呢?
比如这样:
class P {
private:
const int N=15;
int costs[N];
...
}
很遗憾,这样不行,编译器会抛出一个错误:
说我们non-static
变量N用的不对,看到了吧?报错信息里的描述是non-static
变量,也就是说我们这里定义的N不是一个static
类型的,所以不能用来初始化数组。
那怎么样才算对了呢?很简单,我们可以定义成static
变量就对了。
class P {
private:
static const int N=15;
int costs[N];
...
}
也就是在const int
前面加上了static
关键字,表示这是一个static
即静态变量。这个常量会和其他静态变量存储在一起,而不是存储在对象里,这样的话也就被所有对象共享了。
对于像是Java
、Python
等其他语言来说,类中的静态变量是可以通过类名直接访问的,而C++中不行。
除了定义静态变量之外,还有一种方法就是定义类枚举:
class P {
private:
enum {N=15};
int costs[N];
...
}
这样也能运行,看起来非常不可思议。
通过这种方式声明并不会创建类数据成员,对于类的对象来说,并不包含枚举,这里的N只是一个符号名称。在类当中遇到它的时候,编译器会用15来代替。
也正是因为我们只是为了创建符号常量,而不是创建枚举类型的变量,所以不需要提供枚举名。有一些C++的类库当中也用到了这种方法,比如ios_base::fixed
等。
2.类枚举
传统的枚举类型变量存在一定的问题,最大的问题是当两个枚举定义中的枚举量重名的时候,就会发生冲突:
enum A {small, big, medium};
enum B {small, large, xlarge};
这两个枚举类型当中都有small
,如果位于相同的作用于,那么就会发生冲突。
为了避免这个问题,C++11
当中提供了一种新枚举,它的作用域为类,声明类似这样:
enum class A {small, big, medium};
enum class B {small, large, xlarge};
和上面的代码几乎是一样的,只不过多了一个关键字class
,换成struct
也是可以的。
当我们使用的时候,需要加上解析运算符:
A choice = A::small;
B c = B::large;
另外我们前面说过,常规的枚举将自动转化为整型,比如赋值给int变量或者是用于比较表达式的时候。而作用域内枚举不会隐式地转换类型。


猜你喜欢
- 本文实例为大家分享了C语言实现生日贺卡的具体代码,供大家参考,具体内容如下//********** 编译环境VC6.0 **********
- 从 <<Windows Forms 2.0 Programming, 2nd Edition>> &nbs
- 之前我们有介绍通过Spring Boot Admin来检测服务的上下线,然后进行通知功能。https://www.jb51.net/arti
- 批量添加一对多中间表建立中间表A,一个id对应多个lid;传入两条参数long id;//单个数值List lid;//集合数值dao层语句
- 在servlet中,转发和重定向是由request和response完成的。两者之间的区别请看我之前的文章。那么在springMVC中是如何
- Java提示缺少返回值语句怎么办?这里我们给大家提供具体的解决方法。首先,以下面的程序为例,会看到在控制台有:错误:缺少返回语句的提示。找到
- 前置知识Kotlin协程不是什么空中阁楼,Kotlin源代码会被编译成class字节码文件,最终会运行到虚拟机中。所以从本质上讲,Kotli
- 如果要想使一个catch block能抓获多种数据类型的异常对象的话,怎么办?C++标准中定义了一种特殊的catch用法,那就是” catc
- 在使用c#进行控制IIS服务启动停止的时候,提示:【无法打开计算机“.”上的 IISADMIN 服务】这种情况是发生在像vista、win7
- 本文实例实现一个启动画面,采用了显示Aform,过一段时间,隐藏这个Aform,showdialog下一个Bform,closeAForm这
- 作为程序员,开发完一段代码,实现了某个功能时,有必要知道:我的程序需要多长时间?是什么导致我的程序消耗很多内存?比如,统计或者处理了一大批数
- 1,如今NestedScrolling运用到很多地方了,要想好看一点的滑动变换,基本上就是使用这个来完成的,让我们来简单的了解一下。2,Ne
- 一、线程间等待与唤醒机制wait()和notify()是Object类的方法,用于线程的等待与唤醒,必须搭配synchronized 锁来使
- fastjson转换对象实体@JsonProperty不生效项目场景请求第三方应用 返回json数据问题描述第三方返回的数据中,存在java
- 前言相信大家在写前端脚本的时候经常会遇到发送数据到后台的情况,但是由于浏览器的限制,不同域名之间的数据是不能互相访问的,那前端怎么和后端如何
- 前言实现轨迹回放,GMap.NET有对应的类GMapRoute。这个类函数很少,功能有限,只能实现简单的轨迹回放。要实现更复杂的轨迹回放,就
- 前言Android通过设置Alpha值图片淡化、透明度大家应该都知道,下面是段简单的示例代码:View v = findViewById(R
- 概述主要用于Java线程里指定时间或周期运行任务。Timer是线程安全的,但不提供实时性(real-time)保证。构造函数Timer()默
- 1、说明使用Directory类对指定文件夹下的今天或者更早日期之前的文件进行删除。2、代码//文件夹路径string strFolderP
- 一、构造方法概述构造方法是一种特殊的方法作用:创建对象Student stu = new Student();格式:pucli class