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

const详解

作者头像
用户7272142
发布于 2023-10-11 13:18:04
发布于 2023-10-11 13:18:04
47700
代码可运行
举报
文章被收录于专栏:Republic博客Republic博客
运行总次数:0
代码可运行

基本概念

const名叫常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的。习惯性的使用const,可以避免在函数中对某些不应修改的变量造成可能的改动。

修饰基本数据类型

2.1 const修饰一般常量及数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int const a = 100;
const int a = 100; //与上面等价
int const arr [3] = {1,2,3};
const int arr [3] = {1,2,3};//与上面等价

限定这些变量作为常量,无法修改

2.2 const修饰指针(*)

2.2.1 常量指针

当为常量指针时,==不可以通过修改所指向的变量的值==,但是指针==可以指向别的变量==。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int a = 5;
const int *p =&a;
*p = 20;   //error  不可以通过修改所指向的变量的值

int b =20;
p = &b; //right  指针可以指向别的变量

2.2.2 指针常量

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int a = 5;
int *const p = &a;
*p = 20;     //right 可以修改所指向变量的值

int b = 10;
p = &b;      //error 不可以指向别的变量

2.2.3 总结

如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;

如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。

const修饰函数

const 在函数中根据修饰的位置分为三种:函数参数、函数返回值、成员函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const  int fun (const int a) const;

3.1 const修饰函数参数

==修饰函数形参;函数体内不能修改形参a的值。==

如果函数作为输出用,不论是什么数据类型,也不论采用指针传递还是引用传递,都不能加const 修饰,否则参数会失去输出功能。所以:const 只能修饰输入作用的参数

3.1.1 如果参数为指针

如果输入参数为指针,加上const之后就会起保护指针意外修改的作用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void StringCopy(char* strDest, const char* strSource);

在这个函数定义中,我们的的参数strsource加上const修饰,就是为了防止strsource被修改。 实参中,指针会指向一段内存地址,调用函数之后,函数会产生一个临时指针变量,这个变量的地址与实参的地址不一样,但是这两个指针指向的内存是同一块。形参加上const 修饰之后,保护了这一块内存地址不被修改,如果刻意修改这一块内存,编译器会报错。

3.1.2 如果参数为引用

如果输入参数为引用,加上const 之后既起到了保护作用,也提高了程序效率。 我们前面用到的构造函数Stock::Stock(const string &co,long n,double pr)这里的const引用是因为如果我们string co,则函数需调用构造函数创建一个临时对象,如果用引用,则表示是实参的一个别名,不会产生临时对象,而const这里是为了防止修改对象。

3.2 const修饰函数返回值

修饰返回值,就是不能修改返回值

对于函数来说,返回值如果是int类型的值,就算用const限定,但是函数调用结束会清楚栈,因此没有必要

如果函数返回值是指针的话,我们加上限定符号,接收的变量也必须有限定符

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const char * func();
const char* str = func();

如果返回值是引用,也可以提高效率。但是一般返回引用的地方并不是很多,一般会出现在类的赋值函数中。而且,用const 修饰返回值为引用类型的更少。一般来说不常用。

3.3 const修饰成员函数

const 修饰的成员函数为了保护成员变量,要求const 函数不能修改成员变量,否则编译会报错。 函数体内不能修改成员变量的值,只有成员函数才可以在后面加const,普通函数后加const无意义。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Stock
{
private:

  std::string company;
  long share;
  double share_val;
  double total_val;
  void set_tot() { total_val = share_val * share; }
public:
  Stock();
  ~Stock();
  Stock(const std::string& co, long n, double pr);
  void buy(long num, double price);
  void sell(long num, double price);
  void update(double price);
  void show() const;//const
};

const函数

const 对象只能访问const 成员函数,非const 的对象可以访问任何成员函数,包括const 成员函数。

如果函数名、参数、返回值都相同的const成员函数和非const成员函数是可以构成重载,那么const对象调用const成员函数,非const对象默认调用非const的成员函数。

const成员函数可以访问所有成员变量,但是只能访问const的成员函数。

非const成员函数,可以访问任何成员,包括const成员成员函数。 const成员函数不能修改任何的成员变量,除非变量用mutable修饰。

使用const的好处

可定义常量 防止意外修改造成的错误

便于进行类型检查 const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。

为函数重载提供了一个参考 const修饰的函数可以看作是对同名函数的重载。

可以节省空间,避免不必要的内存分配 const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象宏一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而宏定义的常量在内存中有若干个拷贝。

提高了效率 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期的常量,没有了存储与读内存的操作,使得它的效率也很高。 所以我们在平时使用参数的时候,对于没有修改需求的变量或者参数 应该用const保护。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-09-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
EasyC++57,类的实现
我们通常会在同名的cpp文件当中实现,实现的时候,需要使用作用域解析运算符来表示函数所属的类:
TechFlow-承志
2022/08/26
1530
this指针
我们目前接触到的都是对单个对象的操作,show是用来输出对象中的价格总计,如果要让程序知道类的数据,一般是让方法返回一个值供外部使用。即
用户7272142
2023/10/11
1640
const的定义和使用解析
在函数的参数列表中,对某个参数使用const限定符,表示该参数是只读的,函数内部不可以修改该参数的值。
小李很执着
2024/06/15
2360
C/C++开发基础——类对象与构造析构
private: 类的成员可以被同一个类中的成员函数访问,或者被友元函数访问,该修饰符可以禁止一些针对类中成员的高风险操作。
Coder-ZZ
2023/09/18
3110
C/C++开发基础——类对象与构造析构
C++ const各种用法总结
原文链接:https://www.toutiao.com/i6644404128439075332/
Steve Wang
2019/09/23
2.1K0
【C++】类和对象核心总结
a. 在C语言阶段我们就已经认识到了结构体,它可以帮助我们实现多种数据结构,功能强大不言而喻。在C++中为了更好的封装,以及更好的将现实生活抽象化为计算机世界,采用面向对象的思想帮助程序猿能够对用户需求进行抽象思维化,不得不需要类class的出现。
举杯邀明月
2023/04/12
8230
【C++】类和对象核心总结
历史上最全的const用法总结
其实const的用法在八股文系列的文章中很常见,但是总是过于零散,总结不是很全面,遂整理成文,以供大家享用,如果有不够全面还请大家补充,万分感谢。
程序员的园
2024/07/18
820
历史上最全的const用法总结
C/C++中const的作用总结
1)#define定义的常量没有类型,所给出的是一个立即数;const定义的常量有类型名字,存放在静态存储区。
_咯噔_
2022/03/08
1.1K0
AboutCPlusPlus之const关键字
const 是 constant 的缩写,本意是不变的,不易改变的意思。在 C++ 中用来修饰内置类型变量、自定义对象、成员函数、返回值、函数参数。
王强
2021/04/29
5930
C++笔试面试题整理
封装来源于信息隐藏的设计理念,是通过特性和行为的组合来创建新数据类型让接口与具体实现相隔离。
Zoctopus
2018/09/28
2.7K0
C++笔试面试题整理
类中的知识点
1.this 指针 在简单的程序中,类成员函数通常涉及一个对象,但是复杂时有可能涉及两个对象,这种情况就要用到指针。 多说无益,look!
用户8247415
2021/04/13
3570
EasyC++58,构造函数
我们定义了类之后,在使用之前,往往还需要对类进行初始化。这篇介绍的就是对类进行初始化的方法。
TechFlow-承志
2022/08/26
1610
const的那些事
在我们使用c/c++的时候,或者在面试的时候,会被问道与const相关的问题,比如const修饰放在指针的哪个位置,const修饰的引用传递与值传递等等,这些究竟是什么个情况,本节就是专门来解决const的疑难杂症,干掉const,offer拿到手软!
公众号guangcity
2019/09/20
6710
define与const关键字的多种用法
这将创建一个名为 SQUARE 的宏,它接受一个参数 x,并返回 x * x 的结果。比如可以在代码中使用 SQUARE(5) 来得到 5 的平方。
SarPro
2024/02/20
1600
指针讲解:*&p和&*p 及const的用法总结
一讲到指针,不少同学就会觉得云里雾里。首先要明白,指针和地址是一个概念;然后明白指针和指针变量的区别。
怪兽
2022/10/04
6250
指针讲解:*&p和&*p 及const的用法总结
C++:类和对象(上)
类(class)和C语言中的结构体(struct)是类似的,都可以封装数据,但是结构体封装不了函数,但是类可以。类将变量和方法封装在一起的设计明显是更利好的,在一些数据结构,如栈、对队列等就能很好体现优势
HZzzzzLu
2024/11/26
1440
C++:类和对象(上)
C++之类和对象
在学习C语言的时候,遇到一个问题的时候我们更关注于的是解决这个问题需要哪些步骤;因此称C语言为面向过程的语言。而面向对象的语言在遇到问题时则不再将重点放在过程上,而是将重点转移到解决这个问题需要的对象上。
始终学不会
2023/03/28
1.2K0
C++之类和对象
const特性总结(不断更新)
作者:bakari  时间:2012.6.5 1、指向const对象的指针---const int *cptr; i、在此,cptr是指向int类型的const对象的指针,cptr并非是const,可以指向其他具有const特性的对象。    *cptr的对象不可以改变。    e.g:  *cptr = 43;//ERROR! ii、不能将非const对象的地址赋给指向const对象的指针。反之可以,下面在谈。     记住这句话,具有限制的东西永远有最高的权限。 iii、不能使用void*保存const
Linux云计算网络
2018/01/10
7710
const括号前括号后
将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数
ljw695
2024/10/18
1440
const括号前括号后
C/C++关键字详解-----`const`的使用
作为一个关键词,你可以将 const 视为对数据的权限控制机制之一,它主要用于限制数据的可变性,从而提高代码的安全性和可靠性。通过使用 const,可以缩小对数据的修改权限,确保数据在某些情况下不被意外修改。
薄荷冰
2024/03/11
2360
相关推荐
EasyC++57,类的实现
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验