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

一、从例程介绍

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

c 复制代码
#include <iostream>

void testArray(const int& len) {
    //编译错误,len不是常量
    int buf[len] = {0};
}
int main()
{
    const int len = 100;
    int buf[len] = {0};//OK

    testArray(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。

三、例程

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

c 复制代码
#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

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

四、总结

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

相关推荐
YueiL1 小时前
基于RK3588的智慧农场系统开发|RS485总线|华为云IOT|node-red|MQTT
c++·物联网·华为云·rk3588·rs485
二进制人工智能1 小时前
【OpenGL学习】(二)OpenGL渲染简单图形
c++·opengl
Dream it possible!2 小时前
LeetCode 热题 100_寻找重复数(100_287_中等_C++)(技巧)(暴力解法;哈希集合;二分查找)
c++·leetcode·哈希算法
丶Darling.2 小时前
Day119 | 灵神 | 二叉树 | 二叉树的最近共公共祖先
数据结构·c++·算法·二叉树
醍醐三叶3 小时前
C++文件操作--2 二进制文件操作
开发语言·c++
li星野4 小时前
C++:C++内存管理
开发语言·c++
溟洵4 小时前
【C++ Qt】布局管理器
开发语言·c++·qt
我家大宝最可爱4 小时前
c++动态链接库
开发语言·c++
乌萨奇也要立志学C++4 小时前
【C++详解】string各种接口如何使用保姆级攻略
c++
C++ 老炮儿的技术栈4 小时前
自定义CString类与MFC CString类接口对比
c语言·c++·windows·qt·mfc