Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >AboutCPlusPlus之const关键字

AboutCPlusPlus之const关键字

作者头像
王强
发布于 2021-04-29 06:56:57
发布于 2021-04-29 06:56:57
59400
代码可运行
举报
文章被收录于专栏:Python爬虫实战Python爬虫实战
运行总次数:0
代码可运行

最近打算整理一下 C++ 的知识点,在 github 上搞一个项目,美其名曰“AboutCPlusPlus”,项目地址:https://github.com/CPythoner/AboutCPlusPlus

const 是 constant 的缩写,本意是不变的不易改变的意思。在 C++ 中用来修饰内置类型变量、自定义对象、成员函数、返回值、函数参数。

1. 修饰普通类型的变量

对于基本的数据类型,修饰符 cosnt 可以在类型说明符前,也可以用在类型说明符后面,其结果是一样的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const int a = 5;
int const b = 5;
const int arr1[3] = {1,2,3};
int const arr2[3] = {1,2,3};

来看一些对 const 变量的操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const int a = 10;
a = 11;    // 错误:不能为 const 变量赋新值
int &b = a;   // 错误:不能为 cosnt 变量绑定 non-const 引用
const int &c = a; // 正确
int *d = &a;  // 错误:不能为 const 变量绑定指向 non-const 的指针
const int *e = &a; // 正确

const 与 define 宏定义的区别:

  1. 处理阶段不同:define 是在预处理阶段,define 常量不会被编译器看到,因为在预处理阶段已经替换了;const 常量在编译阶段使用。
  2. 类型和安全检查不同:define 没有类型,不做检查,仅仅是字符替换;const常量有明确的类型,在编译阶段进行类型检查;
  3. 存储方式不同:define 是字符替换,有多少地方使用,就会替换多少次,不会分配内存;编译器通常不会为 const 常量分配空间,只是将他们保存在符号表内,使它们成为一个编译期间的常量,没有读取内存的操作,效率也很高。

2. 修饰指针变量

const 修饰指针变量有三种情况:

2.1 const 修饰指针指向的内容,则内容为不可变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const int *p = 8;

const 修饰指针内容,即 *p 的值不可变,只能为8。因为 const 位于 * 的左边,称为左定值

2.2 const 修饰指针,则指针为不可变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int a = 8;
int* const p = &a;
*p = 9; // 正确
int b = 7;
p = &b; // 错误

对于 const 指针 p 其指向的内存地址不能改变,但其内容可以改变,称为右定向,因为 cosnt 位于 * 右边。

2.3 cosnt 修饰指针和指针指向的内容,则指针和指针指向的内容都为不可变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int a = 8;
const int* const p = &a;

这时 p 只想的内容和指向内容地址都已固定,不可改变。

3. 修饰函数参数和返回值

3.1 修饰函数参数

  1. 值传递的 cosnt 修饰:一般这种情况不需要const修饰,因为函数会自动产生临时变量复制实参值;
  2. const 修饰指针参数:防止指针被修改;
  3. cosnt 修饰引用参数:为了增加效率(因为参数为引用不会创建副本)的同时防止被修改,对一般的 int、double 等内置类型,不采用引用的传递方式。

3.2 修饰函数返回值

  1. 修饰内置类型的返回值,这种情况实际无意义,因为参数返回本身就是赋值。
  2. 修饰自定义类型的返回值,此时返回的值不能作为左值使用,既不能被赋值,也不能被修改。
  3. 修饰指针或引用的返回值,保证指针指向内容不被改变。

4. 修饰类的成员变量和成员函数

4.1 类的成员变量

const 修饰类的成员变量,表示该成员为常量,不能不修改,只能在初始化列表中赋值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class A
{const int nValue; //成员常量不能被修改A(int x): nValue(x) { } ; //只能在初始化列表中赋值
}

4.2 类的成员函数

const 修饰类的成员函数,表示该成员函数不能修改类中的任何非 const 成员变量,一般 const 卸载函数的后面,比如 void func() const;

如果有个成员函数想修改对象中的某一个成员变量,可以使用 mutable 关键字修饰这个成员变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
using namespace std;
class Test
{
public:
    Test(int _m,int _t):_cm(_m),_ct(_t){}
    void Kf()const
    {
        ++_cm; // 错误
        ++_ct; // 正确
    }
private:
    int _cm;
    mutable int _ct;
};
 
int main(void)
{
    Test t(8,7);
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 C与Python实战 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
const关键字总结
被const修饰的变量是不能改变的 const修饰变量时,必须在声明变量的同时给出初始化(类中的const成员变量不一样)
WindSun
2019/08/29
6250
C++与C中的const关键字有何差别?
在《const关键字到底该怎么用》一文中介绍了C语言中的const关键字,本文说说C++中的const关键字,它的大部分特点和C语言中的类似,所以本文主要针对不同之处。
编程珠玑
2019/11/13
7670
define与const关键字的多种用法
这将创建一个名为 SQUARE 的宏,它接受一个参数 x,并返回 x * x 的结果。比如可以在代码中使用 SQUARE(5) 来得到 5 的平方。
SarPro
2024/02/20
1620
C/C++中const的作用总结
1)#define定义的常量没有类型,所给出的是一个立即数;const定义的常量有类型名字,存放在静态存储区。
_咯噔_
2022/03/08
1.1K0
C++中const小结
1、const修饰普通变量(非指针变量) const修饰变量,一般有两种写法: const TYPE value; TYPE const value; 对于一个非指针的类型TYPE,这两种写法在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是只读的。 2、const修饰指针变量 通用的准则: 在没有括号的情况下: 如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量; 如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。
用户1215536
2018/02/05
6000
C/C++关键字详解-----`const`的使用
作为一个关键词,你可以将 const 视为对数据的权限控制机制之一,它主要用于限制数据的可变性,从而提高代码的安全性和可靠性。通过使用 const,可以缩小对数据的修改权限,确保数据在某些情况下不被意外修改。
薄荷冰
2024/03/11
2370
C++ const各种用法总结
原文链接:https://www.toutiao.com/i6644404128439075332/
Steve Wang
2019/09/23
2.1K0
【C语言】const 关键字详解
const关键字在C语言中用于定义常量,提供只读的变量。这意味着一旦初始化,const变量的值不能再被修改。下面详细介绍const关键字的用法、作用以及其在不同上下文中的应用。
LuckiBit
2024/12/07
3630
【C语言】const 关键字详解
【C++】const关键字
实际上和const修饰结构体一样,当需要打印数据时,并且当数据量太大,不想复制一份数据到内存空间时,就传一个地址或者引用,此时形参改变,实参也会跟着改变,所以此时需要防止实参被修改!
后端码匠
2023/02/27
5180
【C++】const关键字
【C语言】const 关键字
 🚩write in front🚩    🔎大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 🏅2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星Top100~阿里云专家博主 & 星级博主~掘金⇿InfoQ~51CTOP创作者~周榜126﹣总榜960⇿全网访问量30w+🏅 🆔本文由 謓泽 原创 CSDN首发🙉如需转载还请通知⚠ 📝个人主页-謓泽的博客_CSDN博客 📃 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 📣系列专栏-【C语言】关键字_謓泽的
謓泽
2022/12/12
5740
【C语言】const 关键字
C++:23 再议const的用法(下)
(2)不能将const 类型的实参传递给形参为non-const 类型引用的函数。
用户3479834
2021/02/03
4310
const的那些事
在我们使用c/c++的时候,或者在面试的时候,会被问道与const相关的问题,比如const修饰放在指针的哪个位置,const修饰的引用传递与值传递等等,这些究竟是什么个情况,本节就是专门来解决const的疑难杂症,干掉const,offer拿到手软!
公众号guangcity
2019/09/20
6720
C++ 中 const 和 constexpr关键字解析:常量、函数和指针
这是最基本的一种用法,顾名思义,就是将该变量修饰为常量,从而不可以修改。很多的全局变量都是通过常量来进行修饰,需要注意的是,使用const关键字修饰的变量需要立刻初始化
小万哥
2023/02/24
1.1K0
C++ 中 const 和 constexpr关键字解析:常量、函数和指针
多才多艺的const
这样的global实际上是一个常量,这是C++用来取代宏定义的其中一种措施,const常量有类型检测,提高编译器的效率。
用户2617681
2019/08/08
4730
那些陌生的C++关键字
那些陌生的C++关键字 学过程序语言的人相信对关键字并不陌生。偶然间翻起了《C++ Primer》这本书,书中列举了所有C++的关键字。我认真核对了一下,竟然发现有若干个从未使用过的关键字。一时间对一
Florian
2018/02/05
1K0
那些陌生的C++关键字
【面试宝典】C++中const关键字的用法
对于刚毕业的应届生来说面试中经常被问到const关键字的用法,小编在这里为大家总结如下: 修饰常量 用const修饰的变量某种意义上就是常量,编译器会对它进行必要的操作比宏定义多了类型修饰符。需要注意的是在声明的时候要进行初始化,特别是在类类型中,需要在初始化列表中初始化。 修饰指针 (1)const int *p; p指针const int的指针,不能用赋值语句对*p赋值,但是可以对p赋值。 (2)int* const p=&j; p是指向int的const指针。p是const数据,所以其本身不可改变
程序员互动联盟
2018/03/16
8400
学过 C++ 的你,不得不知的这 10 条细节!
对于书中的「条款」这一词,我更喜欢以「细节」替换,毕竟年轻的我们在打 LOL 或 王者的时,总会说注意细节!细节!细节~ —— 细节也算伴随我们的青春的字眼
小林coding
2020/03/31
7940
学过 C++ 的你,不得不知的这 10 条细节!
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作
构造函数是特殊的成员函数,其中函数名与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有一个合适的初始值,并且在对象整个生命周期内只调用一次
是店小二呀
2024/08/09
1900
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作
const的定义和使用解析
在函数的参数列表中,对某个参数使用const限定符,表示该参数是只读的,函数内部不可以修改该参数的值。
小李很执着
2024/06/15
2440
C++模板(关键字template,typename)介绍
模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。
Twcat_tree
2022/11/29
1.4K0
相关推荐
const关键字总结
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验