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;
这样就解决了这个问题。
分享到:
相关推荐
今天在写程序的时候,出现了一个错误 “对象包含与成员函数不兼容的类型限定符”,从... 您可能感兴趣的文章:C++中const用法小结C和C++ const的声明差异C++ 中const和复合类型C++中的const和constexpr详解C++编程中的co
4.2.5 指针和const限定符 110 4.3 C风格字符串 113 4.3.1 创建动态数组 117 4.3.2 新旧代码的兼容 120 4.4 多维数组 122 小结 124 术语 125 第5章 表达式 127 5.1 算术操作符 129 5.2 关系操作符和逻辑操作符 131 ...
2.4 const限定符 2.5 引用 2.6 typedef名字 2.7 枚举 2.8 类类型 2.9 编写自己的头文件 小结 术语 第3章 标准库类型 3.1 命名空间的using声明 3.2 标准库string类型 3.3 标准库...
2.4 const限定符 2.5 引用 2.6 typedef名字 2.7 枚举 2.8 类类型 2.9 编写自己的头文件 小结 术语 第3章 标准库类型 3.1 命名空间的using声明 3.2 标准库string类型 3.3 标准库...
2.4 const限定符 53 2.4.1 const的引用 54 2.4.2 指针和const 56 2.4.3 顶层const 57 2.4.4 constexpr和常量表达式 58 2.5 处理类型 60 2.5.1 类型别名 60 2.5.2 auto类型说明符 61 2.5.3 ...
2.4 const限定符 53 2.4.1 const的引用 54 2.4.2 指针和const 56 2.4.3 顶层const 57 2.4.4 constexpr和常量表达式 58 2.5 处理类型 60 2.5.1 类型别名 60 2.5.2 auto类型说明符 61 2.5.3 ...
小结 术语 自测练习 自测练习答案 练习 第2章 控制结构 2.1 简介 2.2 算法 2.3 伪代码 2.4 控制结构 2.5 if选择结构 2.6 if/e1se选择结构 2.7 while重复结构 2.8 构造算法:实例研究1(计数器控制重复) 2.9 ...
小结 术语 自测练习 自测练习答案 练习 第2章 控制结构 2.1 简介 2.2 算法 2.3 伪代码 2.4 控制结构 2.5 if选择结构 2.6 if/e1se选择结构 2.7 while重复结构 2.8 构造算法:实例研究1(计数器控制重复) 2.9 ...
<br>实验四 综合(课程设计) 内容及步骤: 1、假定一维数组a[n]中的每个元素值均在[0,200]区间内,用C++编写一个算法,分别统计出落在[0,20],[21,50],[51,80],[81,130],[131,200]等各区间内的元素...
小结------------------------------------------------------------------27 术语------------------------------------------------------------------29 自测练习-----------------------------------------...