C++中const限定符小结

本文详细解释了C++中const限定符的作用、使用场景及其与迭代器、引用、指针、函数参数传递等复合类型的结合方式。重点讨论了const限定符在全局变量、迭代器、引用、指针和函数参数传递中的应用,提供了多个实例帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c++中新增加了一种限定符:const限定符。它的作用是是得它限定的对象(或者内置类型的变量)不能改变。
举一个简单的例子,当我们定义const int bufSize = 512时,变量bufSize虽然还是左值,但是它已经不能被修改了。也正是因为不能被修改的原因,我们需要在定义时对其初始化。
有一点需要注意,当我们在一个文件中定义一个普通全局变量(非const)时,在整个程序中都可以访问,只要我们在另一个文件中加入extern声明:
//在file1.cpp中定义
int counter;
//在file2.cpp中访问
extern int counter;
++counter;

但是,如果我们定义的是一个const变量,那么它只能在定义的文件中访问,别的文件不能访问。除非我们指定const变量为extern:
//在file1.cpp中:
extern const counter int bufSize = 512;
//在file2.cpp中
extern const counter int bufSize;
for(int index = 0; index != bufSize;++index)
//具体操作
这个其实不难理解,但是C++提供一些复合类型,当这些复合类型与const结合以后,事情就变得复杂了。我们先看最简单的情况:
迭代器:
STL库中,允许(并推荐)我们使用迭代器来访问各种容器,比如vector、list、deque。举一个简单的例子:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<int> score(10,1);
	for(vector<int>::iterator  it = score.begin(); it != score.end(); it++)
		cout<<*it<<endl;
	
	return 0;

}


当我们使用迭代器只是为了浏览而不修改容器的内容时,我们可以使用更安全的迭代器,这个迭代器是得我们不能修改容器中每个元素的值。

int main()
{
	vector<int> score(10,1);
	for(vector<int>::const_iterator  it = score.begin(); it != score.end(); it++)
		cout<<*it<<endl;
	
	return 0;



引用:
当一个变量时const时,我们需要使用指向const对象的引用来访问它,不能用一般的引用。我们也不能通过这个这个引用来修改变量的值。
当一个变量为非const类型时,我们一般使用普通的引用就能访问它。但我们仍然可以使用const引用来访问,但此时不能通过这个引用(但可以通过其他方式)来修改这个变量。
简而言之,就是const引用可以绑定到const类型和非const类型上,而非const引用则只能绑定到非const类型上。

指针:
这就有两种情况了:
指向const对象的指针和const指针。
指向const对象的指针意味着指针指向的对象的值不能修改(但是我们可以对指针重新赋值,让他指向令一个const类型的对象):

	const double pi = 3.14;
	const double PI = 3.1415;
	const double *ptr = π
	cout<<*ptr<<endl;
	ptr = &PI;
	cout<<*ptr<<endl;



还有一点需要注意,与引用类似:指向const类型的指针可以绑定到const类型和非const类型上,而非const指针则只能绑定到非const类型上。
const指针与const int的含义类似,意味着这个指针的指向不能修改,需要在定义指针时就将指向定义。但是所指对象的具体值倒是可以不停的变化:

	int a= 0;
	int *const ptr = &a;
	for(; a<10; a++)
		cout<<*ptr<<endl;



函数参数传递:
如果实参为const,而形参为非const(也非引用),这样的传递是合法的,因为实参到形参的只是简单复制操作,并没有修改实参,
反之,如果形参是非const,实参是const,那么这个函数不能改变实参的局部副本。

还有一种情况,就是对整个函数声明为const,这意味着这个函数不会修改任何值,比如类中用来获取变量值的get函数,或者是显示打印结果的display函数等等。但是有时候,这些函数偏偏不巧,需要改变一些变量的值,比如在调用打印函数时,我们还想统计调用了多少次打印信息,(使用access_ctr来记录)那么我们必须在display函数中加上一句access_ctr++;但是由于这个函数时const的,所以编译时会出错,这时候,我们可以将display函数设定为非const函数,但是更多的时候,我们会把access_ctr变量设置为“可变的”:

mutable size_t access_ctr;

这样就解决了这个问题。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值