C/C++关键字详解-----`const`的使用

作为一个关键词,你可以将 const 视为对数据的权限控制机制之一,它主要用于限制数据的可变性,从而提高代码的安全性和可靠性。通过使用 const,可以缩小对数据的修改权限,确保数据在某些情况下不被意外修改。

而根据使用。

下面我讲叙述几种const的使用场景:

常量声明

const 关键字可以用于声明常量,语法为:const <类型> <变量名> = 值;。例如:

const int a = 100;
int const a=100;//等价于上面

指针

const 关键字也可以用于指针和引用,从而创建指向常量对象的指针或引用。这意味着指针或引用指向的值不能被修改。例如:

const int* ptr=12; // 指向常量的指针,即const数据,非const指针
int const* ptr=12; // 与上一行相同,指向常量的指针
int* const ptr=12; // 常量指针,指针本身是常量,即const指针,非const数据
const int& ref = some_value; // 常量引用,引用的值不能被修改

其中

  1. 当为常量指针时,不可以通过修改所指向的变量的值,但是指针可以指向别的变量
  2. 当为指针常量时,指针常量的值不可以修改,就是不能指向别的变量,但是可以通过指针修改它所指向的变量的值

函数参数

在函数的参数列表中,使用 const 关键字可以声明不可修改的参数。这样做可以确保函数内部不会修改参数的值。例如:

codevoid print(const string& str) {cout << str << endl;
}

成员函数

在类的成员函数中,其实会默认传入一个this指针如果函数不会修改成员变量的值,可以在函数声明和定义中使用 const 关键字,从而使其成为常量成员函数。例如:

codeclass MyClass {
public:void print() const {cout << "This is a constant member function" << endl;}
};

当我们对成员函数使用const时,无法使this指针中的成员变量进行修改。

函数指针

其实函数指针也是指针,使用const时任然遵循const和指针的结合使用方法。当 const 与函数指针结合时,主要涉及到指向常量的函数指针以及常量函数指针。

1.指向常量的函数指针:可以使用 const 修饰函数指针,使其指向的函数不能修改其所操作的数据。这种用法适用于指向不会修改数据的函数,以确保函数的调用不会导致数据被修改。示例如下:

cppCopy codevoid func(int x) {cout << "Value: " << x << endl;
}int main() {void (*const ptr)(int) = func; // 指向常量的函数指针,不能修改指针指向的函数ptr(5); // 调用函数// ptr = nullptr; // 错误,不能修改指针return 0;
}

在上面的示例中,ptr 是一个指向常量的函数指针,它指向了 func 函数,而且在声明后不能再指向其他函数。

2.常量函数指针:也可以将指针指向的函数声明为常量函数,这样的函数指针就只能指向这种类型的函数。示例如下:

cppCopy codevoid func(int x) {cout << "Value: " << x << endl;
}int main() {void (*ptr)(int) const = func; // 常量函数指针,不能修改指针指向的函数ptr(5); // 调用函数// ptr = nullptr; // 错误,不能修改指针return 0;
}

在这个示例中,ptr 是一个常量函数指针,它指向了 func 函数,并且不能指向其他函数。

常量表达式和引用

const 还可以用于创建常量表达式,这些表达式在编译时就可以求值,并且被视为常量。例如:

const int sum = 2 + 3; // 常量表达式

const 和引用结合在 C++ 中通常用于创建指向常量的引用,即 const 引用。这种结合的主要目的是确保引用在其生命周期内不会修改所引用的值,从而提高代码的安全性和可靠性。

通过使用 const 关键字,可以提高代码的可读性、可维护性,并且在一定程度上增强了代码的安全性,防止意外修改常量值。

在 C++ 中,const 引用通常用于以下情况:

避免数据修改:将参数声明为 const 引用可以确保在函数内部不会修改参数的值。这样做既可以提高代码的安全性,也可以避免不必要的拷贝操作。

void print(const string& str) {cout << str << endl;
}

引用临时对象**:const 引用可以绑定到临时对象(右值),以便在函数调用或表达式求值中使用。

string getName() {return "John";
}const string& name = getName(); // 将临时对象绑定到const引用

引用常量const 引用可以指向常量,保证了引用的内容在引用生命周期内不会被修改。

const int& value = 10; // 引用常量值

通过使用 const 引用,可以确保在函数调用或对象操作中不会修改数据,并且能够更加灵活地处理临时对象和常量值。

const在C和C++之间的区别

在 C 和 C++ 中,const 关键字的基本作用是相似的,都是用于创建常量并限制变量的修改。然而,在具体的使用和行为上,C 和 C++ 中的 const 有一些区别:

  1. 字符串常量
  • 在 C 语言中,字符串常量(如 "hello")被视为字符数组的常量,而不是指向常量的指针。因此,可以使用指针指向字符串常量,但不能修改字符串的内容。
  • 在 C++ 中,字符串常量被视为指向常量的指针(const char*),因此使用指针指向字符串常量时,不能修改字符串的内容。为了更严格地保护字符串常量不被修改,可以使用 const char* 或者更好的方式,比如使用 const char[]std::string
  1. 全局常量
  • 在 C 语言中,全局常量可以在声明时使用 const 关键字,但通常也可以使用 #define 指令来定义全局常量。
  • 在 C++ 中,推荐使用 const 关键字来声明全局常量,因为 const 具有类型安全性,而 #define 宏定义则可能导致类型不匹配和错误使用的问题。
  1. const 修饰函数参数
  • 在 C 语言中,const 关键字通常被忽略,因为 C 语言没有函数参数的类型检查。
  • 在 C++ 中,const 关键字用于声明函数参数时,表示参数是只读的,即函数内部不会修改该参数的值。这种用法有助于提高代码的可靠性和安全性。
  1. const 成员函数
  • 在 C++ 中,const 关键字还用于声明成员函数,表示该成员函数不会修改对象的状态。这样的成员函数被称为 const 成员函数,可以在 const 对象上调用,从而提高了 const 对象的使用灵活性。

总的来说,虽然 C 和 C++ 中的 const 关键字都用于创建常量和限制变量的修改,但在一些具体的用法和语义上存在一些差异。在 C++ 中,const 的使用更为严格,并且常常被用于提高代码的类型安全性和可维护性。

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

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

相关文章

【Python数据结构与判断1/7】复杂的多向选择

目录 导入 举个栗子 代码优化 elif 栗子 执行顺序 情况一 情况二 情况三 if-elif-else特性 三种判断语句小结 if if-else if-elif-else 嵌套语句 if嵌套 栗子 执行顺序 相互嵌套 Tips Debug 总结 导入 在前面&#xff0c;我们学习了单向选择的if语句和多项…

第四节:SashulinMessageBroker的团队协作

SMB工程可以通过git或svn等工具进行管理。除此外&#xff0c;SMB也提供了云代码管理功能。实际效果如图&#xff1a; 一、准备工作 1、代码管理相关的表结构 以下是云代码管理表结构&#xff0c;在mysql中运行。 -- Create syntax for TABLE sc_flow CREATE TABLE sc_flow (…

数据结构与算法:链式二叉树

上一篇文章我们结束了二叉树的顺序存储&#xff0c;本届内容我们来到二叉树的链式存储&#xff01; 链式二叉树 1.链式二叉树的遍历1.1二叉树的前序&#xff0c;中序&#xff0c;后序遍历1.2 三种遍历方法代码实现 2. 获取相关个数2.1获取节点个数2.2获取叶节点个数2.3 获取树的…

《软件安装与使用教程》— Git 在Windows的安装教程

目录 Git在Windows安装教程1 获得安装包2 解压文件3 注意事项4 安装步骤4.1 运行安装程序4.2 声明许可4.3 选择安装路径4.4 选择需要安装的组件4.5 选择开始菜单4.6 选择默认编辑器4.7 选择PATH环境4.8 选择HTTPS后端传输4.9 配置行尾巴符转换4.10 配置Git Bash终端仿真器4.11 …

NLP 算法实战项目:使用 BERT 进行模型微调,进行文本情感分析

本篇我们使用公开的微博数据集(weibo_senti_100k)进行训练&#xff0c;此数据集已经进行标注&#xff0c;0: 负面情绪&#xff0c;1:正面情绪。数据集共计82718条(包含标题)。如下图&#xff1a; 下面我们使用bert-base-chinese预训练模型进行微调并进行测试。 技术交流&#x…

STC89C52串口通信详解

目录 前言 一.通信基本原理 1.1串行通信与并行通信 1.2同步通信和异步通信 1.2.1异步通信 1.2.2同步通信 1.3单工、半双工与全双工通信 1.4通信速率 二.串口通信简介 2.1接口标准 2.2串口内部结构 2.3串口相关寄存器 三.串口工作方式 四.波特率计算 五.串口初始化步骤 六.实验…

Python虚拟环境搭建

一、下载安装Anaconda Anaconda官网&#xff0c;下载完成后一路next安装完成即可。 二、使用Anaconda &#xff08;Windows最好配合ConEmu,cmder等非原装cmd使用&#xff09; 查看版本&#xff1a;conda env list 查看已存在的镜像源&#xff1a;conda config --show chann…

万界星空科技MES系统中的车间管理的作用

在了解mes生产管理系统的作用包括哪些方面之前&#xff0c;我们先来了解一下作为生产管理信息化的关键部分&#xff0c;车间管理系统包含哪几个部分&#xff1a;一、mes系统中的车间管理通常包含以下部分&#xff1a; 1、设备管理&#xff1a;用于监控车间内的设备状态&#xf…

新规正式发布 | 百度深度参编《生成式人工智能服务安全基本要求》

2024年2月29日&#xff0c;全国网络安全标准化技术委员会&#xff08; TC260 &#xff09;正式发布《生成式人工智能服务安全基本要求》&#xff08;以下简称《基本要求》&#xff09;。《基本要求》规定了生成式人工智能服务在安全方面的基本要求&#xff0c;包括语料安全、模…

游戏中主流的护甲计算

文章目录 1、护甲1.1、主流的护甲函数1.2、护甲穿透1.3、护甲穿透&#xff08;按百分比&#xff09;1.3、格挡 2、攻速和DPS3、暴击3.1、暴击率3.2、暴击伤害 4、最后一题 1、护甲 1.1、主流的护甲函数 当护甲>0时&#xff0c;护甲函数如下&#xff1a; 伤害减免 1 − 1 …

springboot整合shiro的实战教程(二)

文章目录 整合思路1.创建springboot项目2.引入依赖3.创建Shiro Filter0.创建配置类1.配置shiroFilterFactoryBean2.配置WebSecurityManager3.创建自定义Relm4.配置自定义realm5.编写控制器跳转至index.html6.加入资源的权限控制7. 常见过滤器 登录认证实现登录界面开发controll…

目标网站屏蔽右键检查(使用开发者工具)

问题&#xff1a; 通过网络触手中想要获取某网站的数据出现&#xff1a;鼠标右击&#xff0c;或按ctrl F10 键 无反应&#xff08;也就是打不开类似谷歌的开发工具&#xff09; 问题同等与&#xff1a; 解决网页屏蔽F12或右键打开审查元素 引用&#xff1a; 作者&#xff…

C/C++ BM19 寻找峰值

文章目录 前言题目解决方案一1.1 思路阐述1.2 源码 解决方案二2.1 思路阐述2.2 源码 总结 前言 这道题第一遍做的时候题目条件没有好好的审阅&#xff0c;导致在判断边界问题的时候出了不少岔子。 我的方法是时间复杂度为O(N)的&#xff0c;官方的logN可能更好一些。我的就是简…

C#泛型:高级静态语言的效率利器

文章目录 引入类型约束子类泛型常用的泛型数据结构泛型委托 前文提要&#xff1a; &#x1f48e;超快速成&#xff0c;零基础掌握C#开发中最重要的概念&#x1f48e;抽丝剥茧&#xff0c;C#面向对象快速上手&#x1f48e;Winform&#xff0c;最友好的桌面GUI框架&#x1f48e;…

启发式算法:遗传算法

文章目录 遗传算法-引例交叉变异遗传算法遗传算法流程遗传算法应用遗传算法-引例 在一代代演化过程中,父母扇贝的基因组合产生新扇贝,所以遗传算法会选择两个原有的扇贝,然后对这两个扇贝的染色体进行随机交叉形成新的扇贝。迭代演化也会造成基因突变,遗传算法让新产生扇贝…

Mysql索引底层数据结构

Mysql索引底层数据结构 一、数据结构1.1.索引的本质1.2.MySQl特点1.3.索引数据结构1.4.B-Tree结构1.5.BTree结构1.6.查看mysql文件页大小&#xff08;16K&#xff09;1.7.为什么mysql页文件默认16K&#xff1f;1.8.Hash结构 二、存储引擎2.1.InnoDB2.1.1.聚集索引2.1.2.为什么建…

Kubernetes 存储解释

文章目录 存储架构1、三个概念&#xff1a; pv &#xff0c; pvc &#xff0c;storageclass2、三种PV的访问模式3、三个重声明策略(reclaim policy)4、四个阶段(volumn phase)5、四个PV选择器6、五个可移植性建议7、六个生命周期 存储架构 有可能是最简单的Kubernetes存储解释…

力扣:数组篇

1、数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合。 需要两点注意的是 数组下标都是从0开始的。数组内存空间的地址是连续的 因为数组的在内存空间的地址是连续的&#xff0c;所以我们在删除或者增添元素的时候&#xff0c;就难免要移动其他元素的地址。 …

centos7迁移龙蜥anolis8.8报错

1、报错 UPGRADE INHIBITED Upgrade has been inhibited due to the following problems:1. Inhibitor: Possible problems with remote login using root account#解决 sed -i s/#PermitRootLogin yes/PermitRootLogin yes/g /etc/ssh/sshd_configgrep…

【你也能从零基础学会网站开发】Web建站之javascript入门篇 JavaScript中的表达式、运算符、位运算、递增递减

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 JavaScript…