温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++中const常量的用法案例

发布时间:2020-10-12 17:10:45 来源:亿速云 阅读:214 作者:小新 栏目:编程语言

小编给大家分享一下C++中const常量的用法案例,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!

先对C语言中的const和C++中的const进行讲解,前者const修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边。后者C++在C的基础上对const进行了进化处理。

1、C语言中的const:
  • const修饰的变量是只读的,本质还是变量

  • const修饰的局部变量在栈上分配空间

  • const修饰的全局变量在只读存储区分配空间

  • const只在编译期有用,在运行期无效

  • const不能定义真正意义上的常量

const修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边。const 局部变量是在栈上分配空间,可以通过指针改变这个空间里面的值。过了编译期,const变量的常量特性,只读特性就没有了,只读特性只在编译期有效,运行期根本无效。const修饰的全局变量在只读存储区分配空间,因此如果用指针去修改了const修饰的全局变量,程序就会崩溃,因为修改了程序只读存储区中内容,大部分程序都会发生崩溃。

2、C++中的const

C++在C的基础上对const进行了进化处理,具体表现在:

  • const声明时,在符号表中放入常量

  • 编译过程中发现常量直接以符号表中的值替换(常量折叠)

  • 编译过程中也可能为对应的常量分配存储空间:

    • const用在全局或者使用了static关键字说明,存放在只读数据区

      extern const int i = 10;
      static const int i = 10;
      
      // 或者修饰全局变量
      const int a =10;
      int main()
      {}
    • 局部变量中对const常量使用了&操作符,在栈区分配空间

注意:C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值

符号表是编译过程中产生的一种数据结构

#include <iostream>
#include <string>
using namespace std;

const int i = 10;          // 如果通过指针去改变i,就会出现段错误:尝试修改只读数据区数据
int main()
{
    const int a = 5;
    int *p = (int *)&a;    // &a, 给a标识符分配空间了,并用p指向了该空间,
                           // 可以通过*p访问这个地址,但是不能通过a来访问
    *p = 10;               // 不能通过指针去改变a的值
    cout << a << endl;
    cout << *p << endl;
    
    return 0;
}
3、 与宏定义对比

C++ 中的const常量类似于宏定义

const int c = 5;
// 类似于
#define c 5

但是cosnt与宏定义的区别在于:

  • const常量是有编译器处理

  • 编译器对cosnt常量进行类型检查和作用域检查

  • 宏定义由预处理器处理,只是进行单纯的文本替换

#include <stdio.h>

void f()
{
    #define a 3
    const int b = 4;
}

void g()
{
    printf("a = %d\n", a);
    // 在g函数中访问f函数中的宏定义,完全没有问题
    // 在预处理的时候就进行了宏替换,对编译器来说,就是printf("a = %d\n", 3);
    // 宏是没有作用域的概念
    
    // const 定义的常量,被编译器处理,是有作用域的,不能访问b
    printf("b = %d\n", b);
}

int main()
{
    const int A = 1;
    const int B = 2;
    int array[A + B] = {0};    
    /* C编译
    const修饰得到的只是具有只读特性的变量,数组的大小是由两个变量的大小决定的,
    两个变量相加的结果需要在运行的时候才能直到,因此编译器编译的时候不知道这个数组长度,直接报错
    */
    
    /* C++编译
    const是定义的真正意义上的常量,直接从符号表中取值,编译的时候就知道A和B的值,
    可以得到数组的长度,不会报错
    */
    int i = 0;
    
    for(i=0; i<(A + B); i++)
    {
        printf("array[%d] = %d\n", i, array[i]);
    }
    
    f();
    g();
    
    return 0;
}

看完了这篇文章,相信你对C++中const常量的用法案例有了一定的了解,想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI