-
篇一<
/p>
:
《
const
常量与
define
宏定义的区别》
(1)
编译器处理方式不同
define
宏是在预处理阶段展开。
const
常量是编译运行阶段使用。
(2)
类型和安全检查不同
define
宏没有类型,不做任何类型检查,仅仅是展开。
const
常量有具体的类型,在编译阶段会执行类型检查。
(3)
存储方式不同
define
宏仅仅是展开,
有多少地方使用,
就展开多少次,
不会分配内存。
const
常量
会在内存中分配
(
可以是堆中也可以是栈中
p>
)
。
(4)const
可以节省空间,避免不必要的内存分配。
例如
#define PI 14159
//
常量宏
const doulbe
Pi=14159; //
此时并未将
Pi
放入
ROM
中
......
double i=Pi; //
此时为
Pi
分配内存,以后不再分配!
double I=PI;
//
编译期间进行宏替换,分配内存
double j=Pi;
//
没有内存分配
double J=PI;
//
再进行宏替换,又一次分配内存!
con
st
定义常量从汇编的角度来看,
只是给出了对应的内存地址,
而不是象
#define
一样
给出的是立即数,所以,
const
定义的常量
在程序运行过程中只有一份拷贝,而
#define
定
义的常量在内存中有若干个拷贝。
(5)
提高了效率。
编译器通常不为普通<
/p>
const
常量分配存储空间,
而是将它
们保存在符
号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使
得它的效率也
很高。
const
与
#define
的比较
C++
语言可以用
const
来定义常量,
也可以用
#define
p>
来定义常量。
但是前者比后者有
更多的优点
(
1
)
co
nst
常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安
全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不
到的错误(边际效应)
。
(
2
)
p>
有些集成化的调试工具可以对
const
常
量进行调试,
但是不能对宏常量进行调试。
l <
/p>
【规则
5-2-1
】在
< br>C++
程序中只使用
const
常量而不使用宏常量,即
const
常量完全
取代宏常量。
3
常量定义规则
l
【规
则
5-3-1
】需要对外公开的常量放在头文件中,不需要对外
公开的常量放在定义
文件的头部。为便于管理,可以把不同模块的常量集中存放在一个公
共的头文件中。
l
【规则
5-3-2
】如果某一常量与其它常量密切相关,应在定义中包含这种关系,而不
应给出一些孤立的值。
例如
const float RADIUS=100;
const float
DIAMETER=RADIUS * 2;
4
类中的常量
有时我们希望某些常量只在类中有
效。由于
#define
定义的宏常量是全局的,不能达到
p>
目的,
于是想当然地觉得应该用
const
修饰数据成员来实现。
const
数据
成员的确是存在的,
但其含义却不是我们所期望的。
const
数据成员只在某个对象生存期内是常量,而对于整个
类而言却是
可变的,
因为类可以创建多个对象,
不同的对象其
const
数据成员的值可以不同。
不能在
类声明中初始化
const
数据成员。
以下用法是错误的,
因为类的对象未被创建时,
编译器不知道<
/p>
SIZE
的值是什么。
class A
{
…
const
int
SIZE=100;
//
错误,<
/p>
企图在类声明中初始化
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
数据成员
了,应该用类中的枚
举常量来实现。例如
class A
{
…
enum { SIZE1=100, SIZE2=200}; //
枚举常量
int array1[SIZE1];
int
array2[SIZE2];
};
枚举常量不会占用对象的存储空间,它们在编译时被全部求值。枚举常量的缺点是它的<
/p>
隐含数据类型是整数,其最大值有限,且不能表示浮点数(如
PI
=14159
)
。
sizeof(A)
=1200;
其中枚举部长空间。
enum EM { SIZE1=100, SIZE2=200}; //
枚举常量
sizeof
(
EM
)
=4
;
篇二
:
《
C++
语言中
const
关键字用法总结》
C++
语言中
const
关键字用
法总结
一、
const
是什么
在
C/C++
语言中,
const
关键字是一种修饰符。所谓“修饰符”
,就是在编译器进行编
译的过程中,给编译器一些“要求”或“提示”
< br>,但修饰符本身,并不产生任何实
际代码。
就
const
修饰符而言,它用来告诉编译器,被修饰的这些东西,具有“只读”的特点。在编
< br>译的过程中,一旦我们的代码试图去改变这些东西,编译器就应该给出错误提示。
所以,
const
修饰符的作用主要是利用编译器帮助我们检查自己代
码的正确性。我们使
用
const
在源
码中标示出
“不应该改变”
的地
p>
方,
然后利用编译器,
帮助我们检查这些地
方
是否真的没有被改变过。如果我们不小心去修改了这些地方,编译器就会报错,从而帮
助我
们纠正错误。使用
const
和
不使用
const
,对于最终编译产生的代码并没有影响。
p>
虽然
const
对于最终代码没有影响,
但是尽可能使用
const
,
将帮助我们避免很多错误,
提高程序正确率。
二、<
/p>
const
可以修饰哪些对象
在上面
已经提到过了,
const
是一种修饰符,那它可以作为哪些对
象的修饰符呢?下面
列举了一些
C/C++
中用到
const
的地方。
1
p>
,
const
变量
2
p>
,
const
指针
3
p>
,
const
引用
4
p>
,
const
类
5
p>
,类的
const
成员变量
6
,类的
const
成员函数
p>
7
,
const
修饰函
数的形参与返回值
下面我们分别讨论上面几种情况下,
const
的用法。
三、
co
nst
与变量
p>
当一个变量被
const
修饰后,具有以下
几个特点
1
)该变量只能读取不能修改。
p>
(编译器进行检查)
2
)定义时必须初始化。
3
p>
)
C++
中喜欢用
const
来定义常量,
取代原来
C<
/p>
风格的预编译指令
define
。
1
const
int
var; // Error:
常量
变量
需要初始化设定项
2 const int var1=42;
3 var1=43; //
Error
表达式必须是可以修改的左值
上面代
码中第一行和第三行都有错误,注释便是编译器给出的错误提示。
另外注
意,
在使用
const
变量作为数组的
下标时,
变量的值一定要是一个常量表达式
(
< br>在
编译阶段就能计算得到结果
)
。
1 const int sz=42;
2 int iAr[sz];
3
const int sz1=size(); //
size()
必须是一个返回常量的函数
4
int iAr1[sz1];
5
6 int var=42;
7 const int sz2=var;
8
int iAr2[sz2]; //
errorsz2
只有运行时才知道值
四、<
/p>
const
与引用
我们知
道,引用必须在定义的时候赋值,这样就会所引用的变量绑定在一起并作为它的
一个别名
,在程序中的其他地方,是不能让引用再与其他对象绑定。这个特性,让引用看起
来就像
是
const
对象一样,一旦定义后将不能更改。所以并不存在
const
的引用。
但是我
们却可以引用一个
const
的对象
(
变量
)
,我们称之为对常量的引用,与
普通的引
用不同的时,对常量的引用不能被用作修改它所绑定的对象。
< br>
-
-
-
-
-
-
-
-
-
上一篇:新概念英语第一册总结
下一篇:C语言中英文翻译资料