从Java到C++——常量的使用规则
常量是一种标识符,它的值在执行期间恒定不变。C语言用 #define来定义常量(称为宏常量)。
C++ 语言除了 #define外还能够用const来定义常量(称为const常量)。
一、为什么须要常量
假设不使用常量,直接在程序中填写数字或字符串。将会有什么麻烦?
(1).程序的可读性(可理解性)变差。程序猿自己会忘记那些数字或字符串是什么意思。用户则更加不知它们从何处来、表示什么。
(2).在程序的非常多地方输入相同的数字或字符串,难保不发生书写错误。
(3).假设要修改数字或字符串,则会在非常多地方修改,既麻烦又easy出错。
l 【规则1】 尽量使用含义直观的常量来表示那些将在程序中多次出现的数字或字符串。
比如:
#define MAX 100 // C语言的宏常量
const int MAX = 100;// C++ 语言的const常量
const float PI = 3.14159;// C++ 语言的const常量
二、const和#define的比較
C++ 语言能够用const来定义常量。也能够用 #define来定义常量。
可是前者比后者有很多其他的长处:
(1).const常量有数据类型。而宏常量没有数据类型。
编译器能够对前者进行类型安全检查。而对后者仅仅进行字符替换,没有类型安全检查。而且在字符替换可能会产生意料不到的错误(边际效应)。
(2).有些集成化的调试工具能够对const常量进行调试,可是不能对宏常量进行调试。
l 【规则1】在C++ 程序中仅仅使用const常量而不使用宏常量,即const常量可全然代替宏常量。
三、常量定义规则
l 【规则1】须要对外公开的常量放在头文件里,不须要对外公开的常量放在定义文件的头部。为便于管理。能够把不同模块的常量集中存放在一个公共的头文件里。
l 【规则2】假设某一常量与其他常量密切相关。应在定义中包括这样的关系,而不应给出一些孤立的值。
比如:
const float RADIUS = 100;
const float DIAMETER = RADIUS * 2;
四、类中的常量
有时我们希望某些常量仅仅在类中有效。
由于#define定义的宏常量是全局的,不能达到目的,于是想当然地认为应该用const修饰数据成员来实现。const数据成员的确是存在的,但其含义却不是我们所期望的。const数据成员仅仅在某个对象生存期内是常量。而对于整个类而言却是可变的,由于类能够创建多个对象。不同的对象其const数据成员的值能够不同。
不能在类声明中初始化const数据成员。
下面使用方法是错误的,由于类的对象未被创建时,编译器不知道SIZE的值是什么。
class A
{…
const int SIZE = 100; // 错误,企图在类声明中初始化const数据成员
int array[SIZE]; // 错误。未知的SIZE
};
const数据成员的初始化仅仅能在类构造函数的初始化表中进行。比如
class A
{…
A(int size); // 构造函数
const int SIZE ;
};
A::A(int size) : SIZE(size) // 构造函数的初始化表
{
…
}
A a(100);// 对象 a 的SIZE值为100
A b(200);// 对象 b 的SIZE值为200
如何才干建立在整个类中都恒定的常量呢?
有两种方法,一是用类中的枚举常量来实现;二是将const定义为static类型。
比如
方法一:
class A
{…
enum { SIZE1 = 100, SIZE2 = 200}; // 枚举常量
int array1[SIZE1];
int array2[SIZE2];
};
方法二:
class A
{
//…
static const int SIZE1 = 100; // 枚举常量
static const int SIZE2 = 200; // 枚举常量
int array1[SIZE1];
int array2[SIZE2];
};
枚举常量不会占用对象的存储空间,它们在编译时被所有求值。枚举常量的缺点是:它的隐含数据类型是整数,其最大值有限,且不能表示浮点数(如PI=3.14159)。
从Java到C++——常量的使用规则的更多相关文章
- Java编程基础——常量变量和数据类型
Java编程基础——常量变量和数据类型 摘要:本文介绍了Java编程语言的常量变量和数据类型. 常量变量 常量的定义 一块内存中的数据存储空间,里面的数据不可以更改. 变量的定义 一块内存中的数据存储 ...
- java标识符的作用和命名规则
今天让我们从心开始学习Java,从最基础的开始. 这篇先从java标识符的作用和命名规则说起. 1.作用 常量.变量.方法.类和包等的名称. 2.命名规则 必须以字母._下划线.美元符$开头. 其他部 ...
- java(Hello World) 常量 变量和注意事项
一.java的入门程序 java语言的简单介绍 关于java语言的特点:(1) 简单性和c++相比,java没有头文件.指针.运算符重载等,java语言相当于是一个比较纯净版的c++.(2) 面对对象 ...
- java学习之常量与进制
java中的常量包括以下几类: 1.整型常量,比如:3,5,89,99 2.浮点型常量:比如1.23,5.98,3.1415926 3,字符常量:'a','c','1'(需要注意的一点是字符常量只能包 ...
- DirectX11--深入理解HLSL常量缓冲区打包规则
HLSL常量缓冲区打包规则 DirectX11 With Windows SDK完整目录 欢迎加入QQ群: 727623616 可以一起探讨DX11,以及有什么问题也可以在这里汇报. 尽管打包规则并不 ...
- 第46节:Java当中的常量池
Java当中的常量池 在Java虚拟机jvm中,内存分布为:虚拟机堆,程序计数器,本地方法栈,虚拟机栈,方法区. 程序计数器是jvm执行程序的流水线,是用来存放一些指令的,本地方法栈是jvm操作系统方 ...
- Java中定义常量方法及建议(Class/Interface)
Class定义常量方法(推荐方法) //final修饰符 public final class Constants { //私有构造方法 private Constants() {} public s ...
- Java基础-正则表达式(Regular Expression)语法规则简介
Java基础-正则表达式(Regular Expression)语法规则简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.正则表达式的概念 正则表达式(Regular Exp ...
- 19、java内存分配 常量池详解
在class文件中,“常量池”是最复杂也最值得关注的内容. Java是一种动态连接的语言,常量池的作用非常重要,常量池中除了包含代码中所定义的各种基本类型(如int.long等等)和对象型(如Stri ...
随机推荐
- uva_11997,K Smallest Sums优先队列
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #inclu ...
- bzoj1055: [HAOI2008]玩具取名(dp)
1055: [HAOI2008]玩具取名 题目:传送门 简要题意: 就是固定四个字母,给出这四个字母分别可以由哪两个字母组成,然后在给你一个字符串,要求把这个字符串还原成原始的四个字母的其中一个. 题 ...
- 基于UDP的DDos反射放大攻击
转自:https://www.us-cert.gov/ncas/alerts/TA14-017A Protocol Bandwidth Amplification Factor DNS 28 to 5 ...
- NET下Assembly的加载过程
NET下Assembly的加载过程 最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后发现,并没 ...
- vue -- 7 个 有用的 Vue 开发技巧
1 状态共享 随着组件的细化,就会遇到多组件状态共享的情况, Vuex当然可以解决这类问题,不过就像 Vuex官方文档所说的,如果应用不够大,为避免代码繁琐冗余,最好不要使用它,今天我们介绍的是 vu ...
- BZOJ 4448 主席树+树链剖分(在线)
为什么题解都是离线的-- (抄都没法抄) 搞一棵主席树 1 操作 新树上的当前节点设成1 2 操作 查max(i-xx-1,0)那棵树上这条路径上有多少个点是1 让你找经过了多少个点 查的时候用dee ...
- BZOJ 1336&1337最小圆覆盖
思路: http://blog.csdn.net/commonc/article/details/52291822 (照着算法步骤写--) 已知三点共圆 求圆心的时候 就设一下圆心坐标(x,y) 解个 ...
- zookeeper伪分布安装配置
1.下载路径为:http://mirrors.cnnic.cn/apache/zookeeper/stable/ 2.安装: 第一步 解压zookeeper压缩包: 进入 zookeeper安装目录 ...
- 【转载】eclipse中批量修改Java类文件中引入的package包路径
原博客地址:http://my.oschina.net/leeoo/blog/37852 当复制其他工程中的包到新工程的目录中时,由于包路径不同,出现红叉,下面的类要一个一个修改包路径,类文件太多的话 ...
- PostgreSQL Replication之第四章 设置异步复制(2)
4.2 配置级联复制 正如您在本章已经看到的,设置流复制真的很容易.只需要设置几个参数,做一个基础备份,并享受您的复制设置. 在许多情况下,这种情况更有一点点微妙.在这个例子中我们假设:我们要使用一个 ...