当前位置: 首页 > article >正文

c++中的变量与常量

在 C++ 中,变量常量的区分与是否使用 const 关键字密切相关。被 const 修饰的变量在程序运行时是不可修改的,但这并不意味着它就是常量;实际上,const 变量和常量有一些细微的区别。下面我们详细讲解如何区分 变量常量,以及被 const 修饰的变量是否就是常量。

一、变量与常量的区别

  1. 变量(Variable)

    • 变量是程序中可以存储数据的存储位置。它的值可以在程序运行时被修改。
    • 例子int a = 10;a 是一个变量,它的值可以在运行时被修改。
    • 特性:变量可以是 const 或者非 const,如果没有加 const 修饰符,变量的值是可以修改的。
  2. 常量(Constant)

    • 常量是程序中值不可变的实体。常量的值在定义时就确定,且在整个程序中都不能修改。
    • 例子const int MAX_SIZE = 100;MAX_SIZE 是一个常量,其值在程序运行过程中不能修改。
    • 常量通常是用 const 关键字声明的,但它也可以是其他类型(例如宏常量、枚举常量等)。

二、const 修饰的变量就是常量吗?

const 修饰的变量确实是一个常量,但它与“常量”的含义还是有一些细微的区别。

  1. const 变量的行为

    • const 修饰的变量不能被修改,它的值是不可变的
    • const 关键字本身确保该变量在声明后值不可改变。
    • 但值得注意的是,const 变量本身仍然是一个变量,它占用内存空间,并且可以通过其他方式进行初始化。

    例子

    const int a = 10;  // a 是一个常量,它的值不可修改
    // a = 20;  // 错误:试图修改常量的值
    

    这里的 a 是一个常量,且值不可修改,但它依然是一个变量,只是其值不允许改变。

  2. 常量表达式与 const

    • 如果一个 const 变量是在编译时能够确定值的(比如 const 常量初始化时的值是字面量),那么它可以作为常量表达式constexpr)。
    • constexpr 关键字可以用来定义编译时常量。constexpr 变量不仅是不可变的,而且它必须在编译时就能确定其值。

    例子

    constexpr int MAX_SIZE = 100; // 编译时常量
    

    这里 MAX_SIZE 是一个常量表达式,其值在编译时就已经确定,并且它的值是不可改变的。

三、const 与常量表达式的区别

  1. const 变量

    • const 修饰的变量是在运行时初始化的,可以是任何类型的常量。
    • 它的值不可修改,但可能是在程序运行时才确定的。

    例子

    const int a = 10;  // 在运行时赋值
    const int b = a * 2;  // b 的值是运行时计算的
    
  2. constexpr 常量

    • constexpr 是 C++11 引入的,表示编译时常量。它要求变量在编译时能被求值,通常是字面量常量或者可以在编译时求值的表达式。

    例子

    constexpr int MAX_SIZE = 100; // 必须是编译时已知的值
    constexpr int square(int x) { return x * x; } // 编译时常量表达式函数
    constexpr int result = square(10);  // result = 100,在编译时求值
    

    constexpr 的关键点是它要求值必须在编译时已知,因此它比 const 更加严格。

四、const 与常量的其他区别

  1. const 修饰指针
    const 可以修饰指针,控制指针本身或者指针指向的数据是否可以修改。

    • const int* ptr:表示指向 int 类型常量的指针,指针指向的值不可修改,但指针本身可以指向不同的地址。
    • int* const ptr:表示常量指针,指针本身的地址不可修改,但指向的值可以修改。
    • const int* const ptr:表示指向常量的常量指针,指针的值和指向的内容都不可修改。

    例子

    const int a = 10;
    const int* ptr1 = &a;  // 指针 ptr1 指向常量
    // *ptr1 = 20;  // 错误:不能修改常量
    
    int* const ptr2 = &a;  // 常量指针 ptr2
    // ptr2 = &b;  // 错误:不能修改常量指针的地址
    
    const int* const ptr3 = &a;  // 常量指针,指向常量
    
  2. const 与类型系统
    const 可以应用于多种类型,包括类成员、函数参数、返回类型等,表示不变性

    例子

    class MyClass {
    public:
        const int x = 10;  // 类成员常量
        void setX(const int newX) { x = newX; }  // 错误:x 是常量
    };
    

五、总结

  1. 常量(Constant):常量的值在整个程序运行过程中不可修改,通常是用 constconstexpr 修饰的。

    • const 变量:表示值在运行时不可修改,但它仍然是一个变量,占用内存空间,并且可以在运行时初始化。
    • constexpr 常量:表示编译时已知的常量,必须在编译时确定其值。
  2. const 变量与常量的区别

    • const 变量:变量的值不可修改,但它依然是一个变量。它可以在运行时初始化,其值在程序运行期间保持不变。
    • 常量:通常是指程序中不可改变的值(如 constconstexpr 修饰的常量)。常量的值通常是在编译时已知,并且不会改变。
  3. const 修饰指针const 也可以修饰指针,控制指针本身或指向的数据是否可以修改。

通过这些规则,C++ 中的 const 和常量的概念可以更清晰地区分开。


http://www.kler.cn/a/388952.html

相关文章:

  • Elastic Observability 8.16:增强的 OpenTelemetry 支持、高级日志分析和简化的入门流程
  • 蔚来Java面试题及参考答案
  • 知识图谱6:neo4j查询语句
  • java模拟键盘实现selenium上下左右键 table中的左右滚动条实现滚动
  • java导出pdf
  • Unity3D 包体裁剪与优化详解
  • 绿色未来的关键:先进氢气压力容器技术取得重大进展
  • PHP API为什么要使用多种提交方式
  • Linux的基本指令(一)
  • 数仓工具—Hive语法之窗口函数中的order by
  • mybatisgenerator生成mapper时报错
  • Chapter1:python数据结构与算法
  • 解耦与模块化:鸿蒙平台上的服务注册与查找机制
  • 【Ubuntu】ubuntu 22.04 设置 Xorg 弃用 Wayland
  • webstorm 设置总结
  • Excel和微软小冰的结合应用
  • 7天用Go从零实现分布式缓存GeeCache(学习)(2)
  • MATLAB双坐标轴的figure图中第2个坐标轴怎么调整大小?
  • 数据结构 ——— 查找链式二叉树中值为X的节点
  • RabbitMQ的DLX(Dead-Letter-Exchange 死信交换机,死信交换器,死信邮箱)(重要)
  • OpenCV通过指针裁剪图像
  • C#绑定窗口句柄,获取后台窗口的图片的实现与分析
  • 聚观早报 | 荣耀Magic7 Pro开售;零跑汽车公布10月销量
  • ElasticSearch从环境搭建到如何使用的全过程
  • 论文解读(21)- RNN,LSTM,GRU
  • QNAP QuMagie相册使用指南