C++中的常量定义
本篇笔记总结自一次代码检视。
一般来说,使用C语言编程时我们都习惯在代码当中使用C当中的宏定义来定义一个数值常量:
#define MY_CONST 7
在C++开发项目时,也会经常存在沿袭C当中常量用法情况。所以,如下的一种写法看起来反倒觉得有些不正宗了:
class MyClass {
static const int my_const = 7;
// ...
};
站在编译器的角度,这两种写法都是合法的,但在使用的时候总得二中择一,究竟哪种更合适呢?之前有所耳闻在C++中应该尽可能少的使用C风格的宏定义,这又是为什么呢?
在查找一些资料之后发现,对于减少C当中的宏定义的主要因为下面几个原因:
- 宏在定义函数的时候极易容易出错,这个时候建议使用inline来替代宏函数。
- 宏在定义常量的时候在预处理过程中执行文本替换,在编译期间不会生成对应的符号,不利于调试。所以,在C++当中建议使用const或者enum来定义常量。
在C++当中定义一个常量有两种方式,其一是使用static const,另外一种是使用enum。比如:
class MyClass {
static const int my_const = 7;
enum {another_const = 7};
// ...
};
对于这两种方式,又有一些小名堂在里面。对于在类当中使用const来定义常量时,必须要使用static来修饰该常量,并且需要在类定义外部对该常量做出声明。而对于enum来说大可不必如此,所以Bjane Stroustrup在他维护的FAQ当中建议使用enum这种方式来定义常量。
总归来说,在C++当中定义in-class常量可以有多种方法,可行的就有如上提到的三种定义方法。在编写私有项目时当然看个人的喜好,想用哪一种就用哪一种;当作为开发团队的一员的时候遵循团队倡导的代码规范显得更为可取。在这里个人偏向enum这种定义方法,同时我会选择将常量全部大写:)
class MyClass {
enum {MY_CONST = 7};
// ...
};
C++中的常量定义的更多相关文章
- struts配置中的常量定义
一.常量可以在struts.xml或struts.properties中配置,建议在struts.xml中配置,两种配置方式如下: (1)在struts.xml文件中配置常量 <struts&g ...
- C++ 类中 关于常量定义 理解总结
前言 有时我们希望某些常量只在类中有效.由于#define定义的宏常量是 全局 的,不能达到目的,于是想当然地觉得应该用 const修饰 数据成员来实现.const数据成员的确是存在的,但其含义却不是 ...
- c语言中宏定义和常量定义的区别
他们有共同的好处就是"一改全改,避免输入错误"哪两者有不同之处吗?有的. 主要区别就在于,宏定义是在编译之前进行的,而const是在编译阶段处理的 宏定义不占用内存单元而const ...
- JavaScript 常量定义
相信同学们在看见这个标题的时候就一脸懵逼了,什么?JS能常量定义?别逗我好吗?确切的说,JS当中确实没有常量(ES6中好像有了常量定义的关键字),但是深入一下我们可以发现JS很多不为人知的性质,好好利 ...
- java中接口的定义和接口的实现
1.接口的定义 使用interface来定义一个接口.接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成.定义接口的基本格式如下: [修饰符] interfa ...
- JS中的常量(基本数据类型)和内置对象
JS中的基本数据类型: String .number.null.boolean.undefined.object.symbol(ES6) 1. 利用typeof运算符时其中只有null是异常的,ty ...
- C++中指针常量和常量指针的区别
在C++学习使用过程中,每个人都不可避免地使用指针,而且都或多或少的接触过常量指针或指针常量,但是对这两个的概念还是很容易搞糊涂的. 本文即是简单描述指针常量和常量指针的区别. 常量指针 定义: 又叫 ...
- c++类中的常量
C++类中的常量 由于#define 定义的宏常量是全局的,不能达到目的,于是想当然地觉得应该用 const 修饰数据成员来实现.const 数据成员的确是存在的,但其含义却不是我们所期望的.cons ...
- java中接口的定义与实现
1.定义接口 使用interface来定义一个接口.接口定义同类的定义类似,也是分为接口的声明和接口体,当中接口体由常量定义和方法定义两部分组成.定义接口的基本格式例如以下: [修饰符] in ...
随机推荐
- ios 气泡聊天
最近做的项目里面,有几个模块用到了聊天功能和评论回复的功能,使用的频率还是很高的,所以抽时间做了这个博客,希望能给自己和别人带来方便, 具体代码如下: 1,创建model, #import <F ...
- shell基础篇(三)--引号
---今天篇幅比较少:只介绍引号. shell中的引号有三种:双引号",单引号',反引号`1. 双引号:由双引号括起来的字符,除$.倒引号(`)和反斜线(\)仍保留其特殊功能外,其余字符均作 ...
- Python 入门(八)切片
对list进行切片 取一个list的部分元素是非常常见的操作.比如,一个list如下: >>> L = ['Adam', 'Lisa', 'Bart', 'Paul'] 取前3个元素 ...
- Python 使用正则表达式匹配电子邮箱
如下: In [1]: import re In [2]: email = "1210640219@qq.com" In [3]: regular = re.compile(r'[ ...
- 3dsmax sendto mudbox失效解决方案
查看C:\ProgramData\Autodesk\Synergy下的max.2014.1.64.syncfg和Mudbox.2014.0.Windows.64.syncfg两个文件, 找到 Exec ...
- delphi 获取本机IP地址和MAC地址
unit NetFunc; interface uses SysUtils, Windows, dialogs, winsock, Classes, ComObj, WinInet, Variants ...
- SSH电力项目二
底层方法封装(CommonDaoImpl类) public class CommonDaoImpl<T> extends HibernateDaoSupport implements IC ...
- mysql load data导入脚本
# !/bin/bash ############中文说明###################### #本程序的一些提示需要中文支持,如系统没有安装中文包,请先安装:yum -y groupinst ...
- MariaDB登陆
设置root密码 “mariabd”是新密码 [root@master /]# mysqladmin -u root password mariadb [root@master /]# mysql - ...
- 阅读笔记:Solving the “false positives” problem in fraud prediction
刚读完一篇paper<Solving the “false positives” problem in fraud prediction>,趁热打铁,做个笔记. 文章下载链接:https: ...