C/C++之常量

  常量,相信大家并不陌生,它是一种标识符,其值在运行中恒定不变。在C中通常会使用#define来定义常量,通常被称为宏常量。而C++除了#define外,还可以使用const来定义。比如:

#define MAX 100    // c语言上的宏常量

const int MIN = 10;   // c++

1.使用#define的原因

(1)防止“魔数”的产生,当然可以在程序中使用数字来显示的,但是这会造成他人不理解该数字的含义,使得程序可读性变差。

(2)避免书写错误,假如说程序的多个地方都会使用到该常量,使用数字的话,若造成错误,难免让人很是郁闷啊

2.针对于C++中的关于#define或者const的使用,建议使用const,主要从以下方面考虑:

(1)安全性检查,const常量有数据类型,而宏常量没有数据类型。编译器在会对const常量进行类型检查,而对于#define只是进行替换,所以这样很容易产生意想不到的错误。比如:

#define NUM = 10 + 2

int nNum = NUM * 4;    // 会实现你想要的结果吗?

(2)编译效率,之所以加上这方面的原因是在于编译器对代码编译的过程中,含有#define的地方要对其进行替换,这个想想详细了解的,可参考《程序员自我修养》第二章的编译和链接。

(3)方便调试,有些集成工具可以对const进行调试,但是对#define不可进行调试。

3.类常量

由于#define定义的宏常量是全局的,假如我们希望某些常量只在类中有效的话,#define就不能满足需求了,因此可以使用const修饰数据成员来实现。但是要注意,不可在类的声明中初始化数据成员,由于类的对象未被创建,所以这样是错误的,比如:

class AA

{

const int SIZE = 100;

int nNum[SIZE];

};

vs2012编译器会提示:

error C2864: “AA::SIZE”: 只有静态常量整型数据成员才可以在类中初始化

error C2327: “AA::SIZE”: 不是类型名称、静态或枚举数

error C2065: “SIZE”: 未声明的标识符

(看着上面的提示可在const int SIZE前加个static试试,^_^)

所以,正确的方式应该是这样的:

class AA

{

  AA(int size);

  const int SIZE;

};

AA::AA(int size): SIZE(size)

{

  ....

}

使用该种方式,大家可以想到,因为类可以创建多个对象,所以对于不同的对象其const数据成员的值也是不同的,比如:

AA a(100);     // SIZE 值为100

AA b(200);    // SIZE 值为200

但是,如果想在类中建立一个恒定的常量,该如何呢,有两种方法可做参考:

(1)在类中使用枚举常量来实现,比如:

class A

{

  enum {SIZE1 = 100, SIZE2 = 200};

  int array1[SIZE1];

  int array2[SIZE2];

};

枚举常量不会占用对象的存储空间,在编译时会被全部求值。但是其隐含的数据类型是整数,且最大值有限。

(2)使用static,刚才在上面已给大家提示了哈

class A

{

static const int SIZE = 100;

int array[SIZE];

};

使用static使得该常量与其他静态变量存储在一起,而不是存储在对象中,所以该常量被整个类所共享。

若有错误,请大家提示,感谢^_^

时间: 2024-10-24 13:29:05

C/C++之常量的相关文章

静态修饰符static,类中的常量定义修饰符

static可以用来区分成员变量.方法是属于类本身还是属于类实例化后的对象.有static修饰的成员属于类本身,没有static修饰的成员属于类的实例. 静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失static是一个修饰符,用于修饰成员(成员变量和成员函数)静态成员随着类的加载而加载.静态成员优先于对象存在.静态成员被所有对象所共享静态成员多了一个中调用方式,可以被类名直接调用.静态的优缺点优点: 静态成员多了一种调用方式.可以直接被类名调用 格式 :类名.静态成员.也

第二节 变量 、 基本类型 、 运算符 、 表达式 、 数据 、 类型转换 、 常量

一:变量 定义:在程序运行中随时可以发生变化的量 变量声明:变量的声明只能以数字,字母,下划线,且字母不能开头,同时不能是C#中的关键字. 变量使用:变量必须先声明才能使用,变量赋值必须是对应类型,int age=true:这样就会报错. 二:常量 定义:在程序的生存期内不发生更改的不可变值 常量声明:const关键字  public const int age=10; age在程序内不会变,值一直是10: 三:内置数据类型(数值类型和非数值类型) 数值类型:分为整型和非整型 整型如下图: 非整

OC高效率52之多用类型常量,少用#define预处理指令

// //  ViewController.m //  OC高效率52之多用类型常量,少用#define预处理指令 /**  *     1. 不要用预处理定义常量.这样定义出来的常量不含类型信息,编译器只是会在编译前据此执行查找与替换操作.即时有人重新定义了常量值,编译器也不会产生警告信息,这将导致应用程序中得常量值不一致.        2.在实现文件中使用static const 来定义"只在编译单元内可见的常量".由于此类常量不在全局符号表中,所以无需为其名称加前缀.     

关于常量和变量

  其实这两个定义,在初学c时,我们就该把他们弄懂,其实到了现在我才明白.两者都需要占有内存.不同的是否可以重新赋值.char buf[]=="hello";        //   这里的"hello"用来初始化,不是字符串常量,不需要占用内存. cout<<"hello"<<endl;    //   这里的"hello"是字符串常量,占用内存. 字符串常量的类型是指向字符的指针(char *),它

常量池字符串解析

网上关于String和文章太多了,很多一知半解的作者都在误导大众,本人也是深受其害啊,直到今天看了这篇文章(http://www.wtoutiao.com/a/1023451.html),才拨开层层迷雾,发现JDK6和7的实现还不一样呢,发帖纪录一下. 1 一定要注意String s1=new String("c"); 2 这句话的意思是,编译期在常量池就生成了字符串"c",.运行时在堆也生成了一个string对象"c",注意这两个字符串没有丝毫

详解 常量指针和指针常量

说一下 常量指针和指针常量 的区别. 常量指针 指向常量的指针,也就是说指针指向的对象是常量,指向的常量不能修改.指针不是一个常量, 可以把指针指向别一个常量. 常量指针是我们最常用的,一般声明形式如下: const int *p; int const *p; 例: int a(1), b(3); const int *p; // 或者是 int const *p; p = &a; std::cout << "address : " << p <&

JavaScript语言常量和变量

我们在上一章中介绍使用JavaScript编写一个HelloJS的小程序,其中我们就用到变量.常量和变量是构成表达式的重要组成部分.常量在声明和初始化变量时,在标识符的前面加上关键字const,就可以把该指定为一个常量.顾名思义,常量是其值在使用过程中不会发生变化,实例代码如下:const NUM=100;NUM标识符就是常量,只能在初始化的时候被赋值,我们不能再次给NUM赋值.变量在JavaScript中声明变量,是在标识符的前面加上关键字var,实例代码如下:var scoreForStud

CUDA学习日志:常量内存和纹理内存

接触CUDA的时间并不长,最开始是在cuda-convnet的代码中接触CUDA代码,当时确实看的比较痛苦.最近得空,在图书馆借了本<GPU高性能编程 CUDA实战>来看看,同时也整理一些博客来加强学习效果. Jeremy Lin 在上一篇博文中,我们谈到了如何利用共享内存来实现线程协作的问题.本篇博文我们主要来谈谈如何利用常量内存和纹理内存来提高程序性能. 常量内存 所谓的常量内存,从它的名字我们就可以知道,它是用来保存在核函数执行期间不会发生变化的数据.NVIDIA硬件提供了64KB的常量

Swift语言指南(一)--语言基础之常量和变量

Swift 是开发 iOS 及 OS X 应用的一门新编程语言,然而,它的开发体验与 C 或 Objective-C 有很多相似之处. Swift 提供了 C 与 Objective-C 中的所有基础类型,包括表示整数的 Int,表示浮点数的 Double 与 Float,表示布尔值的 Bool,以及表示纯文本数据的 String. Swift 还为两个基本集合类型 Array 与 Dictionary 提供了强大的支持,详情可参考 (集合类型)Collection Types. 与 C 语言类

Python学习(2)变量、常量、注释

1.变量 变量的概念 :变量 是 为了存储 程序运算过程中的一些中间 结果,为了方便日后调用 变量的命名规则: 1. 要具有描述性 2. 变量名只能_,数字,字母组成,不可以是空格或特殊字符(#?<.,¥$*!~) 3. 不能以中文为变量名 4. 不能以数字开头 5. 保留字符是不能被使用 x=1 y=2 z=x*y print("x乘y等于:",z) 输出结果: x乘y等于: 2   2.常量 常量的概念:不变的量 pie = 3.141592653.... 在Python里面