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,一经查实,立即删除!

相关文章

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…

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

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

决策树 算法原理及代码

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

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

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

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

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

神舟本本放心率

总得票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…

集成算法——Adaboost代码

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

年终抽奖来了

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

嵌入式 Linux下永久生效环境变量bashrc

作者:skdkjxy原文:http://blog.sina.com.cn/s/blog_8795b0970101f1f9.html.bashrc文件 在linux系统普通用户目录(cd /home/xxx)或root用户目录(cd /root)下,用指令ls -al可以看到4个隐藏文件&am…

回归分析——线性回归

机器学习中,对于离散的数据可以做分类问题,那对于连续的数据就是做回归问题,这里对一元线性回归和多元线性回归做一个简介,帮组理解。回归分析:从一组样本数据出发,确定变量之间的数学关系式,对…

编译原理(五)自底向上分析之算符优先分析法

自底向上分析之算符优先分析法 说明:以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记。 基本过程 1. 一般方法:采用自左向右地扫描和分析输入串,从输入符号串开始,通过反复查找当前句型的句柄&#xff0…

做Android开发,要清楚init.rc里面的东西

init.rc 复习看这个之前,先看看大神总结的文章这篇文章总结的非常到位,但是因为代码不是最新的Android版本,对我们最新的Android版本不适用。http://gityuan.com/2016/02/05/android-init/#init rc文件拷贝拷贝其实也就是把文件放到机器的某个…

宏比较值,坑的一B

昨晚上,我准备睡觉,连总给我发了一段代码#include "stdio.h"#define MAX_MACRO(a, b) ((a) > (b) ? (a) : (b)) int MAX_FUNC(int a, int b) {return ((a) > (b) ? (a) : (b)); }int main() {unsigned int a 1;int b -1;printf(&quo…

Linux下Samba服务器搭建

linux文件共享之samba服务器 ——ubuntu 宗旨:技术的学习是有限的,分享的精神是无限的。 关闭LINUX防火墙命令: #ufwdisable 然后就在windows下ping一下linux的IP,如果能ping通,就可以继续下面的内容,如果p…

搞懂C++为什么难学,看这篇就够了!

学C能干什么? 往细了说,后端、客户端、游戏引擎开发以及人工智能领域都需要它。往大了说,构成一个工程师核心能力的东西,都在C里。跟面向对象型的语言相比,C是一门非常考验技术想象力的编程语言,因此学习起…

看图学源码之FutureTask

RunnableFuture 源码学习: 成员变量 任务的运行状态的转化 package java.util.concurrent; import java.util.concurrent.locks.LockSupport;/**可取消的异步计算。该类提供了Future的基本实现,包括启动和取消计算的方法,查询计算是否完成以…