const是constant的缩写,意为不变的,恒定的。在C++中存在const保留关键词,它可以声明一个常量,编译器在编译时直接将其锁死,不可对其的值进行修改,只能读取。下面来详细讲解其用法

最简单的用法

在初始化一个数据,对象时,使用const关键词,将其变为常对象。用const修饰的变量值在程序任意位置不能再被修改,就像一个常数一样使用。不可对其值进行修改,赋值,只能读取

int a = 12;
const int a1 = 114514;
int const a2 = 114514;
a1 = 1919810;//错误,a1已被cosnt修饰,成为常量
a2 = 13;//cosnt在数据类型声明前后均可
a = 11;//普通变量的修饰
const int i;//错误,必须进行初始赋值
string s = "qwqwq";
string const s1 = "qaqaq";
const string s2 = "wqwqwq";
s = "123";//正确
s1 = "qqqqq";//错误
s2 = "swdadw";//错误

const引用

const引用,可以对const对象创建cosnt引用,也可以对普通对象创建const引用,无法对const对象创建普通引用。因为const修饰的变量只能读,因此用一个可以读也可以写的普通引用去和const修饰的可读不可写的变量建立关系显然是不可取的;而对普通对象建立的const引用,只能读取,不能修改,这一特性可以保护原对象,在一些函数里常用。

    const int a1 = 114514;int const a2 = 114514;const int &b1 = a1;const int &b = a;int &b2 = a2;//非法 

然后是一些const引用的特性,可以绑定在类型不同但相关(float和int都是数字,但具体什么叫相关正在努力研究中...)的变量上;也可以让const初始化为一个字面值常量。

    float d = 3.14;//const引用可以绑定到类型不同,但类型相关的变量上const int &d1 = d;//正确,允许这样绑定int &d2 = d;//错误,普通引用无这样的特性const float &e = 3.1415;//const引用也可以直接对没有初始化的数据进行绑定float &f = 3.14159//错误, 普通引用无这种特性

引用在内部存放的是一个对象的地址,它是该对象的别名。对于不可寻址的值,如文字常量,以及不同类型的对象,编译器为了实现引用,必须生成一个临时对象,引用实际上指向该对象,但用户无法访问#来源文章#

const成员函数

将关键字const加在形参表之后,可将成员函数声明为常量。

class student
{private:int num;int score;public:void display() const;
};
void student::display() const
{cout<<num<<endl;
}

const成员函数不能改变其所操作的对象的数据成员,只能读,不能修改;

const成员必须同时出现在声明和函数体中,是常成员函数的一部分。

对于两个成员函数,名字和参数均相同,是否为const会被当做重载

const用于共用数据的保护

常数据成员

class student
{private:const int degree;int num;int score;public:void display() const;
};
void student::display() const
{cout<<num<<endl;
}

在数据成员前加上const将其声明称常数据成员,只能读取,不能修改,需要使用参数列表进行初始化。

常对象

class student
{private:const int degree;int num;int score;public:void display() const;
};
void student::display() const
{cout<<num<<endl;
}
int main()
{const student st1;student const st2;//const放在前放在后均可
}

一个对象被声明为常对象后,仅能调用其中的常成员函数,且无法对内部数据进行修改,需在初始化时带上所有参数。

由于有常函数和常对象的存在,保证了const对象内部数据绝对安全。但有些想要修改的数据则可以用指定可变数据成员的方法

mutable int i;

这样之后就可以用const常成员函数修改。

指向对象的常指针、指向常对象的指针

指向对象的常指针

//指向对象的常指针
time t1(19,12,14),t2;
time *const pl = &t1;

指向常对象的指针

const char c[] = "boy";
const chat* p1 = c;

指向对象的常指针(const pointer):指针的值不变,指向不变。

指向常对象的指针:其指向的类对象的值不能通过指针改变,用于函数参数传递,保护对象。

总结

从C到C++ 番外const的用法相关推荐

  1. yxy和志愿者小姐姐番外篇之大宝宝123追番记(补题,淘汰赛)

    1264: yxy和志愿者小姐姐番外篇之大宝宝123追番记 时间限制: 1 Sec  内存限制: 64 MB                                               ...

  2. 程序员面试金典——番外篇之下一个较大元素II

    程序员面试金典--番外篇之下一个较大元素II Solution1:我的答案,时间复杂度为O(n2)O(n2)O(n^2) 垃圾算法 class NextElement { public:vector& ...

  3. 训练记录番外篇(2):2022 ICPC Gran Premio de Mexico 2da Fecha

    2022 ICPC Gran Premio de Mexico 2da Fecha 2022.10.3 之前训得ak场,个人认为很edu. (顺便一提,可能这个训练记录番外系列的比赛都非常edu,十分 ...

  4. clang static analyzer源码分析(番外篇):RegionStore以及evalCall()中的conservativeEvalCall

    引子 我们在上一篇文章<clang static analyzer源码分析(番外篇):evalCall()中的inline机制>中提及了clang如何创建CallGraph,如何进行函数i ...

  5. 20.番外篇——Vue如何自定义组件并且进行全局配置

    20.番外篇--如何自定义组件并且进行全局配置 前言 1.创建自定义组件 2.导出自定义组件 3.main.js中引入自定义的公共组件并挂在到Vue 4.使用自定义的公共组件 前言 通过之前的系列文章 ...

  6. Node:(番外篇) 如何使用Nodejs向指定邮箱发送邮件

    最近在做一个demo的时候需要使用到了邮件发送验证码的需求(不使用短信验证码的原因主要还是短信验证码需要花费~~),那继node路完结后开始推出番外篇,说说如何使用nodejs模块向邮箱发送信息: 注 ...

  7. 【JS 逆向百例】吾爱破解2022春节解题领红包之番外篇 Web 中级题解

    关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 逆向目标 本次逆向的目标来源于吾爱破解 2022 春节解题领红包之番外篇 Web 中级题,吾爱破解每年都会有派送红包活动(送吾爱 ...

  8. 项目看板开发经验分享(番外篇)——集团碳排放看板(万剑归宗)

    集团碳排放看板展示视频 为什么这期算作一个番外篇呢?因为这个看板里用到的所有开发思路都在前三期全部提到了,也有几个可复用的模块是直接照搬了过来,所以我在开发这个看板时只用了很短的工时就开发完了,算是给 ...

  9. 浅析android手游lua脚本的加密与解密(番外篇之反编译的对抗)

    前言   去年在看雪论坛写了一篇<浅析android手游lua脚本的加密与解密>的精华文章,今年写一篇番外篇,将一些lua反编译对抗的内容整合一起,并以3个实例作为说明(包括2018腾讯游 ...

最新文章

  1. c语言统计输入文本不同字母单词数,【C语言统计不同单词个数编写一个程序,输入一个句子,然后统计-查字典问答网...
  2. Oracle RAC CSS 超时计算 及 参数 misscount, Disktimeout 说明
  3. SAP and ABAP Memory总结
  4. python上下键不能用_python退格、方向键无法正常使用解决方法
  5. 各种排序算法比较--2015年7月23日22:33:43v1.0版
  6. 记录第一次使用linux部署springbootweb项目
  7. Android https通信问题
  8. Redis: 为行情数据库设计键值
  9. ISO9000:2000 质量管理八大原则
  10. SAP HANA - 企业管理软件数据库表结构完整文档
  11. 华为手机怎么修改dns服务器,华为域名解析修改dns
  12. html背景颜色渐变代码
  13. 重装系统——最纯净的windows10系统安装方法
  14. 微信对话框删除后怎么找回聊天记录?
  15. QT5.8 中创建插件时Q_INTERFACES提示Undefined interface
  16. java 队列已满_JAVA中常见的阻塞队列详解
  17. c语言中十六进制乘以16啥意思,C语言16进制中16怎么表示?
  18. 迟来的2018年终总结
  19. 经济危机中的软件外包业
  20. select: Invalid argument

热门文章

  1. Redis底层原理和数据结构-总结篇
  2. 卿学姐与诡异村庄(并查集)
  3. 综合案例之学成在线首页
  4. html邮件在线制作模板,最全EDM模板美化教程,在电子邮件中使用CSS和HTML
  5. 【课程复习】Java Web、框架及项目简单回顾
  6. 什么认证在云计算行业内的含金量最大?考试费用贵不贵?
  7. 网络编程+go+java,Go语言中的TCP/IP网络编程
  8. storm流程——storm
  9. P 算法与 K 算法
  10. 光流传感器 定位精度_光流传感器其它方面的应用