c++之const限定符

本人是最近刚接触的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;
}

猜你喜欢

转载自blog.csdn.net/qq_43702629/article/details/88775546