`
java-mans
  • 浏览: 11391451 次
文章分类
社区版块
存档分类
最新评论

C++中const限定符小结

 
阅读更多

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++中const用法小结C和C++ const的声明差异C++ 中const和复合类型C++中的const和constexpr详解C++编程中的co

    C++ Primer第四版【中文高清扫描版】.pdf

    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 ...

    C++ primer 第4版 原书+习题解答+源码 清晰pdf

     2.4 const限定符  2.5 引用  2.6 typedef名字  2.7 枚举  2.8 类类型  2.9 编写自己的头文件  小结  术语  第3章 标准库类型  3.1 命名空间的using声明  3.2 标准库string类型  3.3 标准库...

    C++Primer中文版(第4版).part4

     2.4 const限定符  2.5 引用  2.6 typedef名字  2.7 枚举  2.8 类类型  2.9 编写自己的头文件  小结  术语  第3章 标准库类型  3.1 命名空间的using声明  3.2 标准库string类型  3.3 标准库...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/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 ...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

     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 ...

    C++大学教程,一本适合初学者的入门教材(part2)

    小结 术语 自测练习 自测练习答案 练习 第2章 控制结构 2.1 简介 2.2 算法 2.3 伪代码 2.4 控制结构 2.5 if选择结构 2.6 if/e1se选择结构 2.7 while重复结构 2.8 构造算法:实例研究1(计数器控制重复) 2.9 ...

    C++大学教程,一本适合初学者的入门教材(part1)

    小结 术语 自测练习 自测练习答案 练习 第2章 控制结构 2.1 简介 2.2 算法 2.3 伪代码 2.4 控制结构 2.5 if选择结构 2.6 if/e1se选择结构 2.7 while重复结构 2.8 构造算法:实例研究1(计数器控制重复) 2.9 ...

    数据结构(C++)有关练习题

    &lt;br&gt;实验四 综合(课程设计) 内容及步骤: 1、假定一维数组a[n]中的每个元素值均在[0,200]区间内,用C++编写一个算法,分别统计出落在[0,20],[21,50],[51,80],[81,130],[131,200]等各区间内的元素...

    C++大学教程

    小结------------------------------------------------------------------27 术语------------------------------------------------------------------29 自测练习-----------------------------------------...

Global site tag (gtag.js) - Google Analytics