const 与 constexpr

const

const 在功能上有两个意义  1.变量只读  2.修饰常量

如果想人为区分 const的哪种功能  只需要看这行const代码在编译时是否成功 若成功那么就是修饰常量   不成功就是变量只读  

解释一下上面的区分规则 :因为我们知道非常量表达式只能在运行时建立并生成 ,所以如果这个const表达式可以在运行之前通过的话 那么肯定就是常量   编译通过不了的 只能在运行时通过的 就是只读变量

解释一下之前不太理解的问题----->只读变量:

int main()
{
    int a = 10;
    const int b = a; //这里的b 是 a赋值后的只读变量

}

 a 的初始化为非常量表达式 只能在运行时生成  b想继承a的值  只能是运行时通过 即b为只读变量

int main()
{
    int a = 10;
    const int &b = a;
    a = 100;
}

正常情况下的const解释清楚后    看这个特殊情况(几乎不实用):引用

b初始化被a赋值后  b为只读变量  但可以通过改变a的值来间接改变b的值 --> 上述代码 b就会改变成100

下面讲述const 与 constexpr 的联系

在C++11中添加了一个新的关键字constexpr,这个关键字是用来修饰常量表达式的。所谓常量表达式,指的就是由多个(≥1)常量(值不会改变)组成并且在编译过程中就得到计算结果的表达式。(特殊说明:是常量表达式就不能存在&符号--->引用可能会改变间接常量的值 所以不能存在&)

int main()
{
    constexpr int a = 10; //10为常量  为常量表达式
    constexpr int b = a ; //a为常量   为常量表达式
    int c = 10; 
    const int d = c; //c为变量 不是常量表达式
}
    

我们可以为 constexpr 是 const 功能中的一种  (因为编译器无法区分我们使用的 const的功能是哪一种 所以用constexpr关键词连限制)  

1. const 有 两个功能 修饰常量  变量只读
 
    而常量表达式  可以 在编译时就处理  无需在运行时处理
    
    但是const 拥有 两个功能 编译器无法区分是哪种功能

    所以这时候就在C++11 中开发了 constexpr 关键词 来特定修饰常量

     注:1.常量表达式和非常量表达式的计算时机不同,非常量表达式只能在程序运行阶段计算出结果,但是常量表达式的计算往往发生在程序的编译阶段,这可以极大提高程序的执行效率

          


const int m = a();  // 不是常量表达式,m的值只有在运行时才会获取。
const int i=520;    // 是一个常量表达式
const int j=i+1;    // 是一个常量表达式

constexpr int i=520;    // 是一个常量表达式
constexpr int j=i+1;    // 是一个常量表达式

int func(const int  num)  // const 功能是变量只读
{
     const int a = 10; // const 功能为常量修饰   
     int array[a];  // 正确  可以用常量来定义数组
     int array2[num];   // 错误  不能用变量来修饰数组(即使是只读的变量)

     // 但在现在的编译器是能运行通过的  但语法实则有问题
}


在使用中建议将 const 和 constexpr 的功能区分开,即凡是表达“只读”语义的场景都使用 const,表达“常量”语义的场景都使用 constexpr

int func( const int num)
{
    constexpr int a = 10;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值