从C到C++ 番外const的用法
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的用法相关推荐
- yxy和志愿者小姐姐番外篇之大宝宝123追番记(补题,淘汰赛)
1264: yxy和志愿者小姐姐番外篇之大宝宝123追番记 时间限制: 1 Sec 内存限制: 64 MB ...
- 程序员面试金典——番外篇之下一个较大元素II
程序员面试金典--番外篇之下一个较大元素II Solution1:我的答案,时间复杂度为O(n2)O(n2)O(n^2) 垃圾算法 class NextElement { public:vector& ...
- 训练记录番外篇(2):2022 ICPC Gran Premio de Mexico 2da Fecha
2022 ICPC Gran Premio de Mexico 2da Fecha 2022.10.3 之前训得ak场,个人认为很edu. (顺便一提,可能这个训练记录番外系列的比赛都非常edu,十分 ...
- clang static analyzer源码分析(番外篇):RegionStore以及evalCall()中的conservativeEvalCall
引子 我们在上一篇文章<clang static analyzer源码分析(番外篇):evalCall()中的inline机制>中提及了clang如何创建CallGraph,如何进行函数i ...
- 20.番外篇——Vue如何自定义组件并且进行全局配置
20.番外篇--如何自定义组件并且进行全局配置 前言 1.创建自定义组件 2.导出自定义组件 3.main.js中引入自定义的公共组件并挂在到Vue 4.使用自定义的公共组件 前言 通过之前的系列文章 ...
- Node:(番外篇) 如何使用Nodejs向指定邮箱发送邮件
最近在做一个demo的时候需要使用到了邮件发送验证码的需求(不使用短信验证码的原因主要还是短信验证码需要花费~~),那继node路完结后开始推出番外篇,说说如何使用nodejs模块向邮箱发送信息: 注 ...
- 【JS 逆向百例】吾爱破解2022春节解题领红包之番外篇 Web 中级题解
关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 逆向目标 本次逆向的目标来源于吾爱破解 2022 春节解题领红包之番外篇 Web 中级题,吾爱破解每年都会有派送红包活动(送吾爱 ...
- 项目看板开发经验分享(番外篇)——集团碳排放看板(万剑归宗)
集团碳排放看板展示视频 为什么这期算作一个番外篇呢?因为这个看板里用到的所有开发思路都在前三期全部提到了,也有几个可复用的模块是直接照搬了过来,所以我在开发这个看板时只用了很短的工时就开发完了,算是给 ...
- 浅析android手游lua脚本的加密与解密(番外篇之反编译的对抗)
前言 去年在看雪论坛写了一篇<浅析android手游lua脚本的加密与解密>的精华文章,今年写一篇番外篇,将一些lua反编译对抗的内容整合一起,并以3个实例作为说明(包括2018腾讯游 ...
最新文章
- c语言统计输入文本不同字母单词数,【C语言统计不同单词个数编写一个程序,输入一个句子,然后统计-查字典问答网...
- Oracle RAC CSS 超时计算 及 参数 misscount, Disktimeout 说明
- SAP and ABAP Memory总结
- python上下键不能用_python退格、方向键无法正常使用解决方法
- 各种排序算法比较--2015年7月23日22:33:43v1.0版
- 记录第一次使用linux部署springbootweb项目
- Android https通信问题
- Redis: 为行情数据库设计键值
- ISO9000:2000 质量管理八大原则
- SAP HANA - 企业管理软件数据库表结构完整文档
- 华为手机怎么修改dns服务器,华为域名解析修改dns
- html背景颜色渐变代码
- 重装系统——最纯净的windows10系统安装方法
- 微信对话框删除后怎么找回聊天记录?
- QT5.8 中创建插件时Q_INTERFACES提示Undefined interface
- java 队列已满_JAVA中常见的阻塞队列详解
- c语言中十六进制乘以16啥意思,C语言16进制中16怎么表示?
- 迟来的2018年终总结
- 经济危机中的软件外包业
- select: Invalid argument