C++ const限定符和auto类型说明符

const限定符

# 1.限定常量

有时我们希望定义这样的变量:它的值不能被改变。为了满足这一要求,我们使用const对变量的类型加以限定:

const int bufSize = 512;

这样就把bufSize定义成了一个常量,它的值不能再发生变化。所以这也就意味着const对象必须要初始化。那么初始化操作对于const对象来说意味着什么呢?如果利用一个对象去初始化另外一个对象,则它们是不是const都无关紧要:

int i = 42;
const int ci = i;  //正确
int j = ci;  //正确

这里要注意的是,虽然使用常量ci去初始化j,但是拷贝一个对象的值并不会改变它,一旦完成拷贝,新的对象就和原来的对象没有什么关系了。

# 2.const对象仅在文件内有效

默认情况下,const对象被限定仅在文件内有效。当多个文件中出现了同名的const变量时,其实等同于在不同文件中分别定义了独立的变量。但是,如果需要将const变量在多个文件中实现共享该怎么办呢?要做到在一个文件中定义const,而在其它多个文件中声明并且使用它,解决的办法就是:对于const变量不管是声明还是定义都添加extern关键字,这样只需要定义一次就够了。

//第一个文件file1
extern const int bufSize = fcn();
//第二个文件file2
extern const int bufSize;  //与file1里面的是同一个

const的引用

对常量的引用不能被用作修改它所绑定的对象:

const int ci = 1024;
const int &r1 = ci;  //正确,引用及其对应的对象都是常量
r1 = 42;    //错误,r1是对常量的引用
int &r2 = ci;    //错误,r2是非常量引用,ci是一个常量

我们知道,引用的类型必须与其所引用的对象的类型一致,但是有两个特殊情况:(1)初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可。

double dval = 3.14;
const int &ri = dval;

ri引用了一个int型的数,但是dval确实一个双精度浮点数,编译器会将其变成如下形式:

const int temp = dval;
const int &ri = temp;

(2)对const的引用可能引用一个并非const的对象

int i = 42;
const int &ri = i;

这种方式是允许的。

# const与指针

顶层const

顶层const表示指针本身是一个常量,不能改变它的指向。

int i = 43;
int * const p1 = &i;

底层const表示指针所指的对象是一个常量。

int i = 43;
const int * p1 = &i;
int const * p2 = &i;

# 常量表达式与constexpr

常量表达式指的是值不会改变且在编译过程中就能得到计算结果的表达式

const int max_file = 20;    //是常量表达式
const int limit = max_file + 1    //limit是常量表达式
int stuff_size = 10;      //stuff_size不是常量表达式
const int sz = getSize();     //sz不是常量表达式

C++11标准规定,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化:

constexpr int mf = 20;  //  正确
constexpr int limit = mf + 1;    //mf+1是常量表达式
constexpr int sz = size();      //只有当size()是一个constexpr函数时才是一条正确的语句

需要注意的是,在constexpr声明中如果定义了一个指针,限定符constexpr仅针对指针有效,与所指的对象无关。

# auto类型说明符

C++11引入auto类型说明符,它可以让编译器通过初始值来推断变量的类型。显然,auto定义的变量必须有初始值。但是,auto会忽略掉顶层const,:

const int ci = i, &cr = ci;
auto b = ci;     //b是一个整数
auto c = cr;    //c是一个整数
auto d = &i; //d是一个整型指针
auto e = &ci;  //e是一个指向整型常量的指针(这是底层const)

但是,有时会遇到一种情况:我想知道这个表达式结果的类型,但是我又不想真的用这个表达式的结果来初始化变量。这个时候就要用到另外一个类型指示符decltype

decltype(f()) sum = x;    //sum的类型就是f()函数的返回类型

编译器并不会实际调用函数f(),而是使用当调用发生时f的返回值类型作为sum的类型。decltype的一个坑:对于decltype所用的表达式来说,如果decltype给变量加上括号,则返回的是引用类型:

int i = 42;
decltype((i)) d;    //错误,d是int&,必须初始化

推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈


嵌入式Linux

微信扫描二维码,关注我的公众号 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vmware虚拟机中ubuntu上网问题

虚拟机linux上网问题 宗旨:技术的学习是有限的,分享的精神是无限的。 1、VMware中虚拟机网络的三种设置 第一种:桥接(bridged) 第二种:NAT 第三种:Host only 。该模式下仅主机可以上网&…

Flume框架基础

* Flume框架基础 框架简介: ** Flume提供一个分布式的,可靠的,对大数据量的日志进行高效收集、聚集、移动的服务,Flume只能在Unix环境下运行。 ** Flume基于流式架构,容错性强,也很灵活简单,主要…

tensorflow的安装

安装好adaconda软件,打开 adaconda prompt anaconda search -t conda tensorflow 查看conda create -n tensorflow python3.5 配置python3.5环境选择 yes 进行安装activate tensorflow 激活tensorflowpip install tensorflow 安装 然后打开adaco…

昨晚三巨头聚餐,顺便聊了这三个问题

今天老何找我们吃饭,我和老何还有老墨是邻居,三年前我们就认识了,而且关系还不错,但是今年疫情的原因我们都没聚过,上周六本来说好要聚一下,但又因为周末带娃的原因又没聚成,今天我在微信群上说…

谈“80后”程序员为什么找不到工作? [转]

所谓“80后”,是指22~27岁之间、受过高等教育、刚刚毕业走向社会或者拥有几年工作经验年轻的一代。 不可否认,“80后”已成为职场上迅速成长的中竖力量,尤其是在国内的研发领域。每个时代都有自己的特点,如果用几个比较典型的正…

决策树 算法原理及代码

决策树可以使用不熟悉的数据集合,并从中提取出一系列的规则,这是机器根据数据集创建规则的过程,就是机器学习的过程。用一个小案例分析:通过No surfacing 和 flippers判断该生物是否是鱼,No surfacing 是离开水面是否…

Linux九阳神功

Linux九阳神功 宗旨:技术的学习是有限的,分享的精神是无限的。 一、基础命令: 1.用户管理类命令 (1)useradd libang 添加用户 —— 在home目录下生成同级的目录 (2)userdel -r libang 删除用…

jpa 总结

转:http://blog.csdn.net/linzhiqiang0316/article/details/52639265 先来介绍一下JPA中一些常用的查询操作: [java] view plaincopy //And --- 等价于 SQL 中的 and 关键字,比如 findByHeightAndSex(int height,char sex); pub…

深度好文|面试官:进程和线程,我只问这19个问题

# 干了这碗鸡汤!我急切地盼望着可以经历一场放纵的快乐,纵使巨大的悲哀将接踵而至,我也在所不惜。-- 太宰治 《人间失格》大家好,这里是周日凌晨4点,仍在笔耕不辍的程序喵大人。下面隆重推出我呕心沥血,耗时…

IIS7报“假”正式版随Server 2008发布

用过Vista的用户都知道,在该系统已经集成了IIS7.0版本,应该有很多用户已经用该版本建立了站点。可是你是否感觉到它的功能并没有传说中的哪么强大呢?这个问题终于在TechEd 2007的“Windows Server 2008中的IIS 7,挑战示来互联网”课程中&…

zbb20180117 汉字转拼音 pinyin4

包地址https://pan.baidu.com/disk/home?#list/vmodelist&path%2F%E5%AD%A6%E4%B9%A0Pinyin4j的基本用法1. 简单介绍有时候,需要将汉字编程对应的拼音,以方便数据的处理。比如在Android手机应用的开发上,要查询联系人的姓名,…

终于有人将进程间通信讲明白了

使用多进程协作来实现应用和系统是一种被广泛使用的开发方法。多进程协作主要有以下三点优势。将功能模块化,避免重复造轮子。增强模块间的隔离,提供更强的安全保障。提高应用的容错能力。进程间通信(Inter-Process Communication&#xff0c…

个人喜欢的歌曲——女生篇

个人喜欢的歌曲 —— 女生篇 1、吴汶芳:孤独的总和2、蔡依林:妥协、柠檬草的味道3、陈姿彤:战争世界、我的世界4、雁卿:怕寂寞5、张碧晨:年轮6、庄心妍:爱囚,以后的以后7、魏新雨:…

神舟本本放心率

总得票8520 可以放心购买 22.0% 1942票 不太放心 64.0% 5510票 看情况 12.0% 1068票投票起止时间:2007-11-15 至2008-11-22转载于:https://www.cnblogs.com/badapple126/archive/2007/11/16/962020.html

梯度下降算法

在学习逻辑回归时,对梯度上升算法进行了应用,看到其他的博客讲解,梯度上升算法适合求最大值,梯度下降算法适合求最小值,这里有一个分析:梯度上升算法公式是学习率,是一个常数。这个是根据逻辑回…

花了一个深夜,才用C语言写了一个2048游戏雏形

12年我毕业的第二个月工资,我就买了一个IPAD,然后在IPAD上下了一个2048游戏,玩起来非常爽。然后这几天看到好几个公众号都发了自己写这个游戏的代码,然后我自己也想试试,所以就有了这篇文章,写代码还是很有…

向银行贷款20万, 分期三年买50万的车,个人借款40万, 贷款10年买200万的房子,再贷款120万分创业...

向银行贷款20万按1年期贷款利率为:6%,若按年还贷款,银行贷款利息为:200,000*6%12,000。连本带息:20*106%21.2万分期三年买50万的车 贷款总额30万 年利率按10%算,分三年还清&#xff…

如何避免测试盲区

测试盲区,也就是软件中测试人员未测试到的地方,造成这方面的原因主要有测试人员对测试需求理解不足、经验不足和思维僵化等原因造成的。接下来,就如何避免测试盲区给出几点建议。 一、 充分理解软件需求需求方面的如果理解有误或者分析遗漏&a…

集成算法——Adaboost代码

集成算法是我们将不同的分类器组合起来,而这种组合结果就被称为集成方法或者是元算法。使用集成方法时会有多种形式:可以是不同算法的集成,也可以是同意算法在不同设置下的集成,还可以是数据集不同部分分配给不同分类器之后的集成…

年终抽奖来了

时间很快,2020年已经到了12月份,我从2018年开始写公众号,经过了快两年是时间,我收获了4万的读者,非常开心。我自己是一个挺逗逼的人,而且我写公众号并不觉得我比别人厉害,技术上我真的就是一个很…