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变量或者是用于比较表达式的时候。而作用域内枚举不会隐式地转换类型。
猜你喜欢
- 实现思路制作一个用户头像选择器仿 WeGame制作一个用户头像选择Canvas为父控件所实现,展示图片使用Image,Path当作
- 一、简介Mybatis-Plus(简称MP)是一个 Mybatis 的一个增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发
- 单线程实现文件分割在老的FAT32文件系统中,最大的单个文件大小必须保存在4G内,对于经常看电影的我这个是不能允许的。不过现在Windows
- privatestring[]GetMoc() { string[]str=newstring[3]; ManagementClassmcC
- 本文实例汇总了Java各种排序算法。分享给大家供大家参考,具体如下:1. 冒泡排序:public class SortTest { pub
- 队列的特点1.可以使用数组和链表两种方式来实现。2.遵循先入先出(FIFO)的规则,即先进入的数据先出。3.属于有序列表。图解实现过程:1.
- C#可以直接引用C++的DLL和转换JAVA写好的程序。最近由于工作原因接触这方面比较多,根据实际需求,我们通过一个具体例子把一个JAVA方
- 基本哪些属于引用类型类(object,string),接口、数组、委托引用类型分配在哪里引用类型变量位于线程栈。引用类型实例分配在托管堆上。
- SpringBoot启动类静态资源路径SpringBoot核心配置类SpringBoot核心JAR包--》spring-boot-autoc
- 一、概述有不少人问我intellij idea的mybatis-plus自动生成插件使用出现各种各样的问题,所以我在这边博客的基础上添加一些
- 以下是介绍利用List的subList方法实现对List分页,废话不多说了,直接看代码把/** *//** * List分页 &
- 本文实例讲述了C#图像处理之木刻效果实现方法。分享给大家供大家参考。具体如下://木刻效果public Bitmap PFilterMuKe
- 几个月前写过一篇博客《xUtils3.0框架学习笔记》 ,上面也有记录通过xUtils实现文件上传的使用方法,代码如下:private vo
- 方式一: 配置文件 application.propertiesserver.port=7788方式二: java启动命令# 以应用参数的方
- 我在5月份的时候就申请了洞态IAST企业版内测,算是比较早的一批用户了。聊聊几个我比较在意的问题,比如API接口覆盖率、第三方开源组件检测以
- 实现字符串库函数功能有些时候我们可能会被限制无法使用库函数,这个时候我们需要编写自己的库函数。但了解了字符串库函数的功能之后,想要实现并不困
- 本文实例分析了Java中的传值调用。分享给大家供大家参考。具体分析如下:Java以引用的方式操作对象实例可以确认的是Java中操作对象的方式
- Java Exception 捕获和显示实例详解 在进行Java B/S架构开发时,经常有这样的场景:后端处理业务逻辑,前端负责
- 最新Spring Data JPA官方参考手册 Version 2.0.0.RC2,2017-07-25https://docs.sprin
- 这篇文章主要介绍了Spring Bean初始化及销毁多种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值