余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

C/C++ const关键字总结(c++中const关键字的作用)

xiyangw 2022-11-26 17:06 25 浏览 0 评论

1. C语言中const关键字

const 在编程中应用比较广泛,const 是 constant 的缩写,意思是“恒定不变的”! 它是定义只读变量的关键字,或者说 const 是定义常变量的关键字。

C/C++ const关键字总结(c++中const关键字的作用)

用 const 定义的变量的值是不允许改变的,即不允许给它重新赋值,即使是赋给相同的值也不可以。所以说它定义的是只读变量。这也就意味着必须在定义的时候就给它赋初值。

用 const 修饰的变量,无论是全局变量还是局部变量,生存周期都是程序运行的整个过程。全局变量的生存周期为程序运行的整个过程这个是理所当然的。而使用 const 修饰过的局部变量就有了静态特性,它的生存周期也是程序运行的整个过程。全局变量是静态的,静态的生存周期就是程序运行的整个过程。但是用const修饰过的局部变量只是有了静态特性,并没有说它变成了静态变量。

局部变量存储在栈中,静态变量存储在静态存储区中,而经过 const 修饰过的变量存储在内存中的“只读数据段”中。只读数据段中存放着常量和只读变量等不可修改的量。举个例子:

(1) 定义常量必须初始化;

const int i = 5; //合法
const int j; //非法,导致编译错误

(2) 在另一连接文件中引用const常量

extern const int i; //合法
extern const int j=10; //非法,常量不可以被再次赋值

(3) 定义指向常量的指针:

int a = 10;
int b = 100;
const int *p1 = &a;

const 和变量类型 int 可以互换位置,二者是等价的,即上条语句等价于:

int const *p1 = &a;
*p1 = 111; //错误,指针指向内存区域不能修改
p1 = &b; //正确,指针指向可以变

(4) 定义指针常量:

int a = 10;
int b = 100;
int * const p2 = &a;
p2 = &b; //错误,指针指向不能变
*p2 = 222; //正确,指针指向的内存可以修改

(5) 定义指向常量对象的常量指针

int a = 10;
int b = 100;
const int * const pp=&a; //指针和指针指向的内容都为不可变量。
p2 = &b; //错误,指针指向不能变
*p2 = 222; //错误,指针指向的内容不可变

(6) 定义字符串

const char *pc = “abcde”; //分配在常量区

(7) 通过指针可以修改常量

const int a = 100;
int *p1 = (int*)&a;
int *p2 = (int*)&b;
* p1 = 101;
printf(“a = %d\n”, a);// 输出的结果是101

2. C++语言中const关键字

C语言和C++中的const有很大区别。在C语言中用const修饰的变量仍然是一个变量;

而在C++中用const修饰过后,就变成常量了。

(1) 定义数组

const int n=5;
int a[n];

这种方式在C语言中会报错,原因在于声明数组时数组的长度必须为一个constant,即常量,虽然n用const限定了,但n终究是一个变量,因此会报错;但是在C++中不会报错,因为在C++中用const修饰过后,n就已经等同于一个常量了,因此可以通过。

(2) volatile 关键字跟 const 对应相反,是易变的,容易改变的意思。所以不会被编译器优化,编译器也就不会改变对a变量的操作

const int a = 100;
volatile const int b = 100;
int *p1 = (int*)&a;
int *p2 = (int*)&b;
* p1 = 101;
* p2 = 102;
cout << a << endl;// 输出的结果仍然是100
cout << b << endl;// 输出的结果则是102

(3) 定义类的成员函数,类的成员变量不可变

class Test
{
public:
   Test() {}
   Test(int m) :cm(m) {}
   int get_cm()const
   {
      cm = 10; //非法,不可修改的左值
      return cm;
   }
private:
   int cm;
};

相关推荐

前后端分离 Vue + NodeJS(Koa) + MongoDB实践

作者:前端藏经阁转发链接:https://www.yuque.com/xwifrr/gr8qaw/vr51p4写在前面闲来无事,试了一下Koa,第一次搞感觉还不错,这个项目比较基础但还是比较完整了,...

MongoDB 集群如何工作?

一、什么是“MongoDB”?“MongoDB”是一个开源文档数据库,也是领先的“NoSQL”数据库,分别用“C++”“编程语言”编写,使用带有“Schema”的各种类似JSON的文档,是也分别被认为...

三部搭建mongo,和mongo UI界面

三步搭建mongo,和mongoUI界面安装首先你需要先有一个docker的环境检查你的到docker版本docker--versionDockerversion18.03.1-ce,b...

Mongodb 高可用落地方案

此落地方案,用于实现高可用。复制集这里部署相关的复制集,用于实现MongoDB的高可用。介绍MongoDB复制集用于提供相关的数据副本,当发生硬件或者服务中断的时候,将会从副本中恢复数据,并进行自动...

一次线上事故,我顿悟了MongoDB的精髓

大家好,我是哪吒,最近项目在使用MongoDB作为图片和文档的存储数据库,为啥不直接存MySQL里,还要搭个MongoDB集群,麻不麻烦?让我们一起,一探究竟,继续学习MongoDB分片的理论与实践,...

IDEA中安装MongoDB插件-再也无要nosql manager for mongodb

大家都知道MongoDB数据库作为典型的非关系型数据库被广泛使用,但基于MongoDB的可视化管理工具-nosqlmanagerformongodb也被用的较多,但此软件收费,所以国内的破解一般...

数据库监控软件Lepus安装部署详解

Lepus安装部署一、软件介绍Lepus是一套开源的数据库监控平台,目前已经支持MySQL、Oracle、SQLServer、MongoDB、Redis等数据库的基本监控和告警(MySQL已经支持复...

YAPI:从0搭建API文档管理工具

背景最近在找一款API文档管理工具,之前有用过Swagger、APIManager、Confluence,现在用的还是Confluence。我个人一直不喜欢用Swagger,感觉“代码即文档”,让代...

Mac安装使用MongoDB

下载MongoDB包:https://www.mongodb.com/download-center解压mongodb包手动解压到/usr/local/mongodb文件夹配置Mac环境变量打开环境...

保证数据安全,不可不知道的MongoDB备份与恢复

大家在项目中如果使用MongoDB作为NOsql数据库进行存储,那一定涉及到数据的备份与恢复,下面给大家介绍下:MongoDB数据备份方法在MongoDB中我们使用mongodump命令来备...

MongoDB数据备份、还原脚本和定时任务脚本

备注:mongodump和mongorestore命令需要在MongoDB的安装目录bin下备份脚本备份格式/usr/local/mongodb/bin/mongodump -h ...

等保2.0测评:mongoDB数据库

一、MongoDB介绍MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产...

MongoDB入门实操《一》

什么是MongoDBMongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之...

Python安装PyMongo的方法详细介绍

欢迎点击右上角关注小编,除了分享技术文章之外还有很多福利,私信学习资料可以领取包括不限于Python实战演练、PDF电子文档、面试集锦、学习资料等。前言本文主要给大家介绍的是关于安装PyMongo的...

第四篇:linux系统中mongodb的配置

建议使用普通用户进行以下操作。1、切换到普通用户odysee。2、准备mongodb安装包,自行去官网下载。3、解压安装包并重命名为mongodb4.04、配置mongodbcdmongod...

取消回复欢迎 发表评论: