您的位置:首页 > 编程语言 > C语言/C++

【C++】用const修饰变量与define的区别

2010-08-08 21:06 281 查看
  用const修饰变量将限定变量为只读,该变量值不允许被改变。下面是const用于定义数组大小的一个简单例子:

  const int ArraySize = 10;
int array[ArraySize];

const变量必须初始化,这个一次性的初始化是设置其数值的唯一机会。

  const int i; //错误,没有初始化

  const也可以用于修饰指针。例如:

  char chA = 'A';
const char chB = 'B';
char *const ptr_1 = &chA; //常指针
  const char *ptr_2 = &chB; //指向常量的指针
  char const *ptr_3 = &chB; //指向常量的指针
  const char *const ptr_4 = &chB; //指向常量的常指针  

  当const与*并存时,正确区分的原则是:如果const位于*后,则指针本身是不能被修改的(常指针),至于指针所指向的变量,则可能允许被修改;如果const位于*前,则指针所指向的变量不能被修改的,即该指针是指向常量的指针,至于指针本身,则可能允许修改。而const与类型标识的位置关系则无关紧要,所以ptr_2和ptr_3是一样的。依据这一原则,很容易判断出下面的操作是否合法。

  ptr_1 = &chB; //错误
  *ptr_1 = chB; //正确
  ptr_2 = &chA; //正确
  *ptr_3 = chA; //错误
  ptr_4 = &chA; //错误
  *ptr_4 = chA; //错误

  const也可以用于修饰引用,但不能用引用改变所指const变量的值。const定义常量对象的引用,可以用常量初始化,也可以用变量初始化。如果用变量初始化,则引用成为该变量的只读别名。也可以用常量表达式初始化const引用,但不可以用常量表达式初始化变量的引用。

  const int i = 1;
int j = 2;
const int &m = i;
const int &n = j;
int &k = i + j; //错误
  const int &p = i + j; //正确

  定义本身为常量的引用变量是无意义的(虽然合法),因为所有引用变量自动成为常量(因为一量引用初始化,就不能引用其他变量)。

  int n;
int &const k = n; //合法但没有意义

  在C语言中,还有用于定义常数的宏#define,它做是值代替(即文本代替),没有类型检查工具。而const提供了类型检查,可以避免值代替时容易出现的一些问题。
  另外,#define不占用内存单元,每次调用都会分配内存,而const变量的定义会保存在符号表里,与一般变量相同,都分配内存空间。

  #include "stdio.h"
#define str1 "This is the first string!/n"
void main(void)
{
    const char str2[] = "This is the second string!/n";
    printf(str1); //为str1第一次分配内存
    printf(str2); //为str2一次分配内存,以后不再分配
    printf(str1); //为str1第二次分配内存
    printf(str2); //不再为str2分配内存
}

  所以使用const还可以节省内存空间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: