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;
}