本人是最近刚接触的c++,可能思考有点浅,还望见谅。
1.顶层const
顶层const是代表const最常用的功能,即表示使用这个const声明的变量已经是一个常量了,以后不能直接或
间接被改变(指针或引用)。
看下面的代码
#include<iostream>
int main()
{
const int a;
a = 100;
system("pause");
return 0;
}
这是一个错误的代码。
很明显,没有初始化,但如果没有const,这个代码可以运行,原因在于a是一个常量,需要一个初值。,但如果把const int a放在main函数外,则a的值为0.
2.底层const
底层const是于指针与引用等混合类型有关。代表的是这个指针不能改变指向的那个值,引用也是如此。
可以这样理解,这只是指针一厢情愿的认为那个值不能改变。
看下面的代码
#include<iostream>
int main()
{
int a = 100;
int const *p = &a;
*p = 50;//错误的,它不能改变
const int *p1 = &a;//这代表的是这个指针只能指向一个固定的变量,代表这是一个常量指针。
const int &y = a;
y = 100;//同理,错误,引用其实是变量的另一个名字.
system("pause");
return 0;
}
理解一下就会明白。
3.组合起来试一下
看下面的代码
扫描二维码关注公众号,回复:
6094086 查看本文章
#include<iostream>
int main()
{
const int a = 100;//具有顶层const的资格
const int *p = &a;//这样指针就是一个指向常量的指针
int const *p1 = &a;//最好不要这样声明,你不知道啥时候会出错。
int &y = a;//这是错误的
const int &y1 = a;//这是正确的
system("pause");
return 0;
}
记住规范的用法,还有一点就是具有底层const资格的指针或引用才能进行,或者数据类型可以转换,
一般非常量可以转换为常量。
4.constexpr
这是c++11新标准的规定,我对这个变量类型并不如何了解,只是知道,在当你明白确定变量是一个常量
表达式时,最后使用它。
还有一点在于const和constexpr的关系。
看下面的代码
#include<iostream>
int main()
{
int i;
std::cin >> i;
const int size = i;
int a[size];/*这是通过不了编译的,因为size的值必须在编译时就要知道
但const修饰的变量可能是运行期才会知道的。*/
int j = 100;
constexpr int size1 = j;
int a[size1];//这是可以的,因为constexpr只能在编译时期就确定的变量。
system("pause");
return 0;
}