「C/C++」C/C++关键字 之 const常量

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「C/C++」C/C++程序设计
📚全部专栏
「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合
「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「PK」Parasolid函数说明

目录

    • C++ 中的 `const` 关键字详解
      • 一、`const` 的基本用法
      • 二、`const` 的高级用法
      • 三、使用`const`的注意事项
      • 四、`const`在现代C++编程中的最佳实践

C++ 中的 const 关键字详解

在C++编程中,const 关键字是一个非常重要的修饰符,它用于声明一个变量、对象或成员函数为常量,意味着这些实体在声明后其值不能被修改。const 的使用不仅可以提高代码的可读性和安全性,还能帮助编译器进行优化。本文将详细探讨C++中const的各种用法、注意事项以及其在现代C++编程中的最佳实践。

一、const 的基本用法

  1. 声明常量变量

    使用const声明的变量在初始化后,其值就不能再被改变。这有助于避免无意中修改关键数据,从而提高程序的稳定性。

    const int max_size = 100; // max_size 的值不能被修改
    
  2. 指针与const

    const与指针结合使用时,可以有两种解释方式,取决于const的位置:

    • 指向常量的指针(指针本身是可变的,但指向的值不可变):

      const int* ptr = &x; // ptr 可以指向不同的 int,但不能通过 ptr 修改 x 的值
      
    • 常量指针(指针本身不可变,但指向的值可以变,这取决于指向的对象是否也是常量):

      int* const ptr = &x; // ptr 不能指向其他位置,但可以通过 ptr 修改 x 的值
      
    • 指向常量的常量指针(指针本身和指向的值都不可变):

      const int* const ptr = &x; // ptr 不能指向其他位置,也不能通过 ptr 修改 x 的值
      
  3. const 成员函数

    const 成员函数是指那些不会修改对象状态的成员函数。在成员函数的声明后加上const关键字,可以告诉编译器和其他程序员这个函数不会改变对象的数据成员。

    class MyClass {
    public:void display() const { // 这是一个 const 成员函数// ... 显示一些信息,但不修改任何数据成员}
    };
    

二、const 的高级用法

  1. const 与引用

    与指针类似,const 也可以用于修饰引用。一个const引用指向的对象不能被修改。

    void process(const std::string& str) {// 可以读取 str,但不能修改它
    }
    
  2. const 对象的成员函数

    只有const成员函数可以被const对象调用。这是因为const对象保证它的状态不会被改变,而只有const成员函数才能保证不会修改对象的状态。

    const MyClass obj;
    obj.display(); // 可以调用 const 成员函数
    // obj.nonConstFunction(); // 错误:不能调用非 const 成员函数
    
  3. const 表达式和constexpr

    C++11引入了constexpr关键字,它允许在编译时计算表达式的值。虽然const表达式也可以在编译时计算(如果它们只依赖于编译时常量),但constexpr提供了更强的保证和更广泛的用途。

    constexpr int square(int x) {return x * x;
    }
    constexpr int size = square(10); // 在编译时计算 10 的平方
    

三、使用const的注意事项

  1. 避免过度使用const

    虽然const可以提高代码的安全性和可读性,但过度使用const可能会使代码变得难以理解和维护。特别是在函数参数和返回值上,应该根据实际需要来决定是否使用const

  2. const的正确位置

    当使用指针和const时,const的位置非常重要。它决定了是指针本身不可变,还是指针指向的值不可变,或者是两者都不可变。

  3. mutable关键字

    mutable关键字用于修饰类的数据成员,即使类是const的,这些成员也可以被修改。这通常用于实现缓存或其他需要在对象不变的情况下更新的数据。

    class MyClass {
    mutable int cache; // 即使 MyClass 的对象是 const 的,cache 也可以被修改
    };
    

四、const在现代C++编程中的最佳实践

  1. 使用const来确保数据的不变性

    在可能的情况下,使用const来声明那些不应该被修改的数据。这有助于提高代码的安全性和可维护性。

  2. 在函数参数和返回值上使用const

    当函数参数不需要被修改时,应该将它们声明为const引用或指针。这可以避免不必要的复制,并提高代码的可读性。对于返回值,如果返回的是一个不需要被修改的对象,也应该考虑使用const

  3. 使用constexpr进行编译时计算

    在C++11及更高版本中,应该优先考虑使用constexpr而不是const来进行编译时计算。这可以提供更好的性能和更强的类型检查。

  4. 理解const的正确含义

    在使用const时,要清楚它的含义和限制。不要仅仅因为看起来“安全”就随意地使用const。相反,应该根据实际的逻辑需求和代码设计来决定是否使用const

总之,const是C++中一个强大而灵活的关键字,它提供了多种方式来确保数据的不变性和安全性。然而,正确地使用const需要深入的理解和实践经验。通过遵循最佳实践并避免常见的陷阱,你可以充分利用const来提高你的C++代码的质量和性能。


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/59730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

复现LLM:带你从零认识语言模型

前言 本文会以Qwen2-0.5B模型为例,从使用者的角度,从零开始一步一步的探索语言模型的推理过程。主要内容如下: 从使用的角度来接触模型本地运行的方式来认识模型以文本生成过程来理解模型以内部窥探的方式来解剖模型 1. 模型前台使用 1.1…

【NLP自然语言处理】深入探索Self-Attention:自注意力机制详解

目录 🍔 Self-attention的特点 🍔 Self-attention中的归一化概述 🍔 softmax的梯度变化 3.1 softmax函数的输入分布是如何影响输出的 3.2 softmax函数在反向传播的过程中是如何梯度求导的 3.3 softmax函数出现梯度消失现象的原因 &…

Matlab 火焰识别技术

课题介绍 森林承担着为人类提供氧气以及回收二氧化碳等废弃气体的作用,森林保护显得尤其重要。但是每年由于火灾引起的事故不计其数,造成重大的损失。如果有一款监测软件,从硬件处获得的图像中监测是否有火焰,从而报警&#xff0…

Linux多线程(个人笔记)

Linux多线程 1.Linux线程概念1.1线程的优点1.2线程的缺点 2.Linux线程VS进程3.Linux线程控制3.1创建线程3.2线程tid及进程地址空间布局3.3线程终止3.4线程等待 4.分离线程5.线程互斥5.1互斥锁mutex5.2互斥锁接口5.3互斥锁实现原理5.4可重入VS线程安全 6.线程同步6.1条件变量6.2…

【EdgeBox-8120AI-TX2】Ubuntu18.04 + ROS_ Melodic + HP60C上手体验

简介:介绍安思疆 HP60C 深度相机在8120AI-TX2控制器上,TX2核心模块环境(Ubuntu18.04)下测试ROS驱动,打开摄像头图像和查看深度图和点云图,本文的前提条件是你的TX2里已经安装了ROS版本:Melodic。…

DataWind将字符串数组拆出多行的方法

摘要: 可视化建模中先将字符串split为array再用explode(array)即可 可视化建模 进入“可视化建模”页面 1.1 新建任务 如果团队内没有可视化建模任务。请点击“新建任务”,输入名称并确定。 1.2 建立数据连接 在左边栏中选择“数据连接”&#xff0c…

【大数据学习 | kafka】简述kafka的消费者consumer

1. 消费者的结构 能够在kafka中拉取数据进行消费的组件或者程序都叫做消费者。 这里面要涉及到一个动作叫做拉取。 首先我们要知道kafka这个消息队列主要的功能就是起到缓冲的作用,比如flume采集数据然后交给spark或者flink进行计算分析,但是flume采用的…

CCF ChinaOSC |「开源科学计算与系统建模openSCS专题分论坛」11月9日与您相约深圳

2024年11月9日至10日,以“湾区聚力 开源启智”为主题的2024年中国计算机学会中国开源大会(CCF ChinaOSC)将在深圳召开。大会将汇聚国内外学术界、顶尖科技企业、科研机构及开源社区的精英力量,共同探索人工智能技术和人类智慧的无…

人工智能——小白学习指南

知孤云出岫 目录 1. **智能评测系统**2. **个性化学习路径推荐**3. **虚拟学习助手**4. **学习行为分析**5. **数据驱动的教学决策**6. **自动化课程推荐**7. **数据隐私与安全保护** 人工智能知识点的总结和学习路线,以数据表格形式呈现,并附带在教育行…

现代Web开发:React Hooks深入解析

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 现代Web开发:React Hooks深入解析 现代Web开发:React Hooks深入解析 现代Web开发:React Hook…

RTC精度及校准

RTC精度偏差: RTC的基准时间和精度与石英晶体的频率相关,晶体的谐振频率取决于温度,因此RTC性能与温度相关,晶体的频率偏差是晶体正常频率的温度反转函数。 一、硬件方面: 1.使用高精度振荡器的RTC模块; …

了解bootstrap改造asp.net core MVC的样式模板

我们都知道,在使用默认的asp.net core MVC模板建立项目的时候,里面的样式是已经事先被写好了的。一般来说都在css目录下的site.css和bootstrap.css及下面的bootstrap.min.css中。我们打开bootstrap这些样式文件,里面有大量的样式类的定义&…

流类库与输入输出

来源:《C语言程序设计》 像C语言一样,C语言也没有输入输出语句。 但C标准库中有一个面向对象的输入输出软件包,即I/O流类库。 流是I/O流类的中心概念。 ------ I/O流类库是C语言中I/O函数在面向对象的程序设计方法中的一个替换产品。 -…

cocos creator 3.8.3物理组件分组的坑

坑,坑的不行的大坑 group用的二进制的左移获取十进制的数值 目前是这样判断的,也不知道对不对,什么get、set Group没找到

基于MFC实现的赛车游戏

一、问题描述 游戏背景为一环形车道图,选择菜单选项“开始游戏”则可开始游戏。游戏的任务是使用键盘上的方向键操纵赛道上的蓝色赛车追赶红色赛车,红色赛车沿车道顺时针行驶,出发点和终点均位于车道左上方。任一赛车先达到终点则比赛结束。…

RHCE的学习(12)

第九章 Ubuntu 什么是Ubuntu 概述 Ubuntu(乌班图)属于Debian系列,Debian是社区类Linux的典范,是迄今为止最遵循GNU规范的Linux系统。 Debian最早由Ian Murdock于1993年创建,分为三个版本分支(branch&…

【案例】故障雪花屏

开发平台:Unity 6.0 开发工具:Shader Graph 参考视频:【U2D Shader Graph】❄️雪❄️花❄️屏❄️   一、效果图 二、Shader Graph 路线图 三、案例分析 核心思路:雪花屏幕效果 (混合) 原图像 最终图像…

有什么办法换网络ip动态

在数字化时代,网络已成为我们生活、工作不可或缺的一部分。然而,随着网络应用的日益广泛,IP地址作为设备在网络中的唯一标识,其重要性不言而喻。动态换IP,作为一种灵活且高效的网络技术,正逐渐受到越来越多…

Spring Boot中集成MyBatis操作数据库详细教程

目录 前言1. 项目依赖配置1.1 引入MyBatis和数据库驱动依赖1.2 数据源配置 2. 创建数据库映射实体类3. 创建Mapper层接口4. 创建Service层4.1 定义Service接口4.2 实现Service接口 5. 创建Controller层6. 运行和测试项目6.1 启动项目6.2 测试接口 7. 总结 前言 在Java开发中&a…

【大语言模型】ACL2024论文-07 BitDistiller: 释放亚4比特大型语言模型的潜力通过自蒸馏

【大语言模型】ACL2024论文-07 BitDistiller: 释放亚4比特大型语言模型的潜力通过自蒸馏 目录 文章目录 【大语言模型】ACL2024论文-07 BitDistiller: 释放亚4比特大型语言模型的潜力通过自蒸馏目录摘要研究背景问题与挑战如何解决创新点算法模型实验效果代码推荐阅读指数&…