const变量与宏的区别

本文详细介绍了C++中const关键字的多种用途,包括如何使用const修饰变量、指针和引用等,以及const与宏定义的区别。通过具体的示例说明了const在不同场景下的应用及其优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

const的用法有四种:参数、返回值、函数,?另一种没有想起来

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

  const int ArraySize = 10;
       int array[ArraySize];//仅限于C++可以这样表示。

       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; //合法但没有意义

 #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还可以节省内存空间。


 


#define T 13                         /*用#define定义的一个常量T*/

int main()

{

        const int t=13;            /*用const定义的一个常量*/

        int n=t;                         /*把t赋值给n*/

       int m=T;                     /*把T赋值给m*/

}

区别:const常量有数据类型, 而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只能进行字符替换,没有类型
 安全检查。而且字符替换可能会带来料想不到的边界效应。
 有些集成化工具可以对const常量进行调试, 但不能对宏量进行调试。

1.差别:const与#define最大的差别在于:前者在堆栈分配了空间,而后者只是把具体数值直接传递到目标变量罢了,#define不占用内存单元,每次调用都会分配内存。

或者说,const的常量是一个Run-Time的概念,他在程序中确确实实的存在可以被调用、传递。而#define常量则是一个Compile-Time概念,它的生命周期止于编译期:在实际程序中他只是一个常数、一个命令中的参数,没有实际的存在。const常量存在于程序的数据段.#define常量存在于程序的代码段。

2优缺点:至于两者的优缺点,要看具体的情况了。

从执行效率上来说#define是一个更好的选择:

i.从run-time的角度来看,他在空间上和时间上都有很好优势。

ii.从compile-time的角度来看,类似m=t*10的代码不会被编译器优化,t*10的操作需要在run-time执行。而#define的常量会被合并。但是:如果你需要粗鲁的修改常数的值,那就的使用const了,因为后者在程序中没有实际的存在.另外在头文件中使用 #define 可以避免头文件重复包含的问题,这个功能,是const无法取代的

从执行稳健性来说用const会好一些:

 在C语言中,还有用于定义常数的宏#define,它做是值代替(即文本代替),没有类型检查工具。而const提供了类型检查,可以避免值代替时容易出现的一些问题。安全检查。而且字符替换可能会带来料想不到的边界效应。 有些集成化工具可以对const常量进行调试, 但不能对宏量进行调试。所以C++中我们一般提倡用const,C语言就看情况使用了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值