【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还可以节省内存空间。
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还可以节省内存空间。
相关文章推荐
- java的修饰引用变量的final和C++的const区别真的很大
- C++ 中 const和define的区别
- C++带const、static和#define关键字的变量定义的区别
- 整理:#define和typedefine的区别 以及const修饰指针的用法
- C++中static、const、static const修饰变量作用详解(转)
- C++中有关const修饰指针和变量
- C/C++语法知识精华整理(1)-左值与右值、变量与常量、 define与const、Printf特点、补码与阶码、位运算等
- C++中const与define的区别
- c++与C const变量的区别
- 【转】【c/c++】define宏定义和const常量定义之间的区别
- C++中static、const、static const修饰变量作用详解
- [C/C++] const 详解(修饰变量、输入参数、返回值、成员函数)
- C++中define与const的区别
- C++中define与const的区别
- 嵌入式培训干货分享:C++中const 和 define 的区别
- C++进阶—>const、define和enum的区别和用途
- [C++] C++中const修饰指针,变量, 函数参数和函数返回值的用法总结
- C++中const和引用修饰变量和函数的总结
- C++ 中 const和define的区别
- C++中const,define和static的区别