跟我学C++中级篇——const和constexpr的使用

2024-05-05 18:36

本文主要是介绍跟我学C++中级篇——const和constexpr的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、从例程介绍

已经不同的篇章里介绍和分析过const及constexpr,特别对于后者,从c++11到c++14直到c++17甚至以后,功能都不断的在完善。那么这么多复杂的应用如何搞清楚呢?下面先从代码看起:

#include <iostream>void testArray(const int& len) {//编译错误,len不是常量int buf[len] = {0};
}
int main()
{const int len = 100;int buf[len] = {0};//OKtestArray(len);return 0;
}

上面的代码中,主函数内的数组buf就可以通过编译,但在函数testArray中的buf就报len非常量。这是一个让许多程序员感到模糊的问题,可能很多人大约明白什么意思,但却道不出来。
其实这很简单,C/C++中要求数组长度定义必须是提前定义好的常量。而const恰好可以满足这一需求,但为什么第一个可以,而第二个不可以呢?因为第是一个编译器看到的是常量的定义,而第二个编译器看到的是只读的变量定义。

二、只读和常量(常量表达式)

有人会问题,只读和常量有什么不同?仍然以上面的例子,在主函数的buf定义长度len,定义为一个常量,即它就是100。它不允许更改也不允许重定义。所以数组以其为长度的定义是符合标准的要求的。编译器自然可以允许其通过编译。
而测试函数中的len,它是通过参数变量len传递进来的,大家都知道,参数的意义是什么?对,就是可变。可以传进去1,也可以传进去100,可以是a,也可以是b…,只要符合类型匹配甚至可以隐式转换,编译器都会允许其通过,但这符合数组的定义啊。数组的长度必须是常量定义。也就是说,即使在参数前增加const等限定符,目的只有一个,不允许修改这个参数,而编译器是不管你传入参数的值是不是一个常量,这才是重点,这就叫只读。
从统一形式来看,常量既是一个定值又是只读的。那么此时再来看const和constexpr就容易分析清楚了。早期的c++标准const其实是兼顾了常量和只读,那么在新的c++标准中,为了现好的体现革命的分工不同,基本上把只读形式定义划给了const而把常量形式定义划给了constexpr。

三、例程

结合上面的分析,再看下面的例程:

#include <iostream>void testReadOnly(const int& d) {std::cout << "d value:" <<d<< std::endl;const int& tmp = d;std::cout << "const tmp change:"<<tmp << std::endl;
}
void testArray(const int& len) {// int buf[len] = {0};
}
int main()
{const int len = 100;int buf[len] = {0};testArray(len);int num = 3;testReadOnly(num);testReadOnly(len);return 0;
}

运行结果:

d value:3
const tmp change:3
d value:100
const tmp change:100

只读是一个外在形式,本身不可以修改,但可以在内部更改。常量是一个恒定现象,确定而不改变。但为了兼容新旧标准,在普通的应用情况下,二者基本是可以认为是相同的。换句话说,可以只记一些不同的特定情况即可,而这些不同的,新标准中,都会说得很清楚。

四、总结

要善于分析和总结学到的知识,要不断的回望自己学习的成果并加以整理分析。每一个简单的进步,其实都是思想上的一次升华,量变到质变,最终产生一次飞跃。古话说得好“勿以善小而不为”。

这篇关于跟我学C++中级篇——const和constexpr的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/962381

相关文章

Spring LDAP目录服务的使用示例

《SpringLDAP目录服务的使用示例》本文主要介绍了SpringLDAP目录服务的使用示例... 目录引言一、Spring LDAP基础二、LdapTemplate详解三、LDAP对象映射四、基本LDAP操作4.1 查询操作4.2 添加操作4.3 修改操作4.4 删除操作五、认证与授权六、高级特性与最佳

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

Java中使用Hutool进行AES加密解密的方法举例

《Java中使用Hutool进行AES加密解密的方法举例》AES是一种对称加密,所谓对称加密就是加密与解密使用的秘钥是一个,下面:本文主要介绍Java中使用Hutool进行AES加密解密的相关资料... 目录前言一、Hutool简介与引入1.1 Hutool简介1.2 引入Hutool二、AES加密解密基础

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序