const修饰符

在 C 中,习惯使用 # define 来定义常量, 例如:
#define LIMIT 100 ;
C + + 提供了一种更灵活、更安全的方式来定义常量, 即使用 const 修饰符来定义常量,例如:
const int LIMIT = 100;
这个常量是类型化的,它有地址, 可以用指针指向这个值,但不能修改它。
const 也可以与指针一起使用,它们的组合情况较复杂, 可归纳为三种:
指向常量的指针、常指针和指向常量的常指针。

  1. 指向常量的指针是指一个指向常量的指针变量, 例如: const char * name = ”chen”; / /
    声明指向常量的指针 这个语句的含义为: 声明一个名为 name 的指针变量, 它指向一个字符型常量, 初始化 name为指向字符串”chen”。 由于使用了 const ,不允许改变指针所指的常量, 因此以下语句是错误的: name[ 3] = ′a′;
    但是,由于 name 是一个指向常量的普通指针变量, 不是常指针, 因此可以改变 name 的 值。例如下列语句是允许的: name =
    ”zhang”; 该语句赋给了指针另一个常量,即改变了 name 的值。
  2. 常指针是指把指针本身, 而不是它指向的对象声明为常量,例如: char * const name = ”chen”; / /
    常指针 这个语句的含义为: 声明一个名为 name 的指针变量, 该指针是指向字符型数据的常指 针,用”chen”的地址初始化该常指针。
    创建一个常指针,就是创建一个不能移动的固定指针, 但是它所指的数据可以改变, 例如: name[ 3] = ′a′; / / 合法
    name = ”zhang”; / / 出错 第一个语句改变了常指针所指的数据,这是允许的; 但第二个语句要改变指针本身, 这是不允许的。
  3. 指向常量的常指针是指这个指针本身不能改变, 它所指向的值也不能改变。要 声明一个指向常量的常指针,二者都要声明为 const,
    例如: const char * const name = ”chen”; / / 指向常量的常指针 这个语句的含义是:声明了一个名为name 的指针变量,它是一个指向字符型常量的常指 针,用“chen”的地址初始化该指针。不难理解以下二个语句都是错误的: name[3] =′a′; / / 出错, 不能改变指针所指的值 name = ”zhang”; / / 出错, 不能改变指针本身

说明:
(1 ) 如果用 const 定义的是一个整型常量, 关键字 int 可以省略。所以下面的两行定义是等价的:
const int LIMIT = 100;
const LIMIT = 100;
(2 ) 常量一旦被建立, 在程序的任何地方都不能再更改
(3 ) 与 # define 定义的常量有所不同, const 定义的常量可以有自己的数据类型,这样C + + 的编译程序可以进行更加严格的类型检查, 具有良好的编译时的检测性。
(4 ) const 的作用与 # define 相似,但它消除了 # define 的不安全性, 因此建议用const取代 # define 定义常量。
下例说明了使用 # define 的不安全性。

#include < iostream .h >
main ( )
{
    int a = 1;
#define T1 a + a;
#define T2 T1 - T1 ;
    cout < < ”T2 is”< < T2 < < endl;
    return 0;
}

初看程序,似乎应打印出:
T2 is 0
但是这个答案是错误的,程序的实际输出结果是:
T2 is 2
其原因是 C + + 把第 7 行语句解释成:
cout < < ”T2 is”< < a + a - a + a < < endl;
如果程序中用 const 取代了两个 # define, 将不会引起这个错误,请看下例。

#include < iostream .h >
int main ( )
{
    int a = 1;
    const T1 = a + a ;
    const T2 = T1 - T1;
    cout < < ”T2 is”< < T2 < < endl;
    return 0;
}

输出: T2 is 0
(5 ) 函数参数也可以用 const 说明, 用于保证实参在该函数内部不被改动, 大多数C + + 编辑器能对具有 const 参数的函数进行更好的代码优化。
(6 ) 虽然美国国家标准化协会 (ANSI) 制定的 C 标准 ( 简称 ANSI C 标准 ) 也采用了const ,但两者略有差别, 如下面的程序段在 C ++ 中是合法的, 但却不能被 ANSI C 所接受:
const int size = 300;
int a[size] ;
另外,在 ANSI C 标准中, const 定义的常量是全局常量, 而 C + + 中 const 定义的常量根据其定义的位置来决定其是局部的还是全局的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值