尽可能使用 const
前言
const 关键字是常量修辞符,如果要告知编译器某个变量在程序中不会发生改变,则可将其声明为 const。
但,对 const 关键字的认识不能仅仅停留在这一层 - 它提供了很多更强大的功能。
因此很多情况下 const 关键字的使用方法也不是简单的 const + 变量,其用法总的来说是比较灵活的。
指针的 const 关键字
const 关键字出现在 * 左边或是右边定义出来的指针完全不同。
const int *pa = &a;
这样的一行代码定义了一个指向整型变量 a 的指针 pa。
其中 const 关键字的作用是说明你无法通过指针 pa 来修改变量 a 的值,此后 *pa = 1 这样的语句将被编译器报错。
int * const pa = &a;
这样的一行代码同样定义了一个指向整型变量 a 的指针 pa。
但这时 const 关键字跑到 * 右边来了,此时它的意义是说明指针 pa 本身无法发生改变,此后 pa++ 这样的语句将被编译器报错。
迭代器的 const 关键字
迭代器其本质,也就是个指针。
但请看定义某个迭代器的语句:
std::vector<int>::iterator iter = v.begin();
这个迭代器指向整型 vector 容器 v 的第一个元素。
现在问题是,没有出现 * ,那么我如何控制这个指针是指向的元素不变,还是其本身不变呢?
答案是,如果直接定义 const 迭代器,如下:
const std::vector<int>::iterator iter = v.begin();
那么定义出来的指针其限制是指针本身不变,如同 const 放在 * 右边。那么如何定义一个指向内容不变,但指针本身可以变化的 const 迭代器呢?
方法如下:
std::vector<int>::const_iterator cIter = v.begin();
实际使用中你会发现,后一种迭代器使用频率很高,而第一种迭代器基本没啥作用,纯属卖萌的。
成员函数的 const 关键字
将一个成员函数的声明末尾加上 const 关键字,可以为该成员函数添加一个约束 - 无法改变其所属对象中成员变量的值。
这个用法很多人会忽略掉,但是它在调试中会发挥到很多意想不到的作用 :)。
啰嗦几句
1. 运算符的重载函数在很多情况下应当返回 const 类型。
2. 成员函数的 const 版本和非 const 版本能够实现重载。
3. const 成员函数的作用更大在于使操作 const 对象成为可能,这一点将在以后的文中提到并细致分析。
小结
const 是个非常实用的关键字,对我们写出高效而健全的代码很有帮助,应当尽可能的去使用它,发挥它的作用。
尽可能使用 const的更多相关文章
- Effective C++ 之 Item 3:尽可能使用 const
Effective C++ Chapter 1. 让自己习惯C++(Accustoming Yourself to C++) Item 3. 尽可能使用 const (Use const whenev ...
- C++ const用法 尽可能使用const [转载]
C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的.如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助. 1.c ...
- C++ const用法 尽可能使用const
C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的.如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助. 1.c ...
- 【转】C++ const用法 尽可能使用const
http://www.cnblogs.com/xudong-bupt/p/3509567.html C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不 ...
- 第二篇:尽可能使用 const
前言 const 关键字是常量修辞符,如果要告知编译器某个变量在程序中不会发生改变,则可将其声明为 const. 但,对 const 关键字的认识不能仅仅停留在这一层 - 它提供了很多更强大的功能. ...
- Effective C++ -----条款03:尽可能使用const
如果关键字const出现在星号左边,表示被指物是常量:如果出现在星号右边,表示指针自身是常量:如果出现在星号两边,表示被指物和指针两者都是常量. char greeting[] = " he ...
- 【03】尽可能使用const
1.为什么搞出const关键字? const指定一个语义约束,指定一个对象不可修改.如果一个对象不可修改,就应该说出来. 2.const与指针 const可以修饰指向之物,也可以修改指针本身.STL中 ...
- Effective C++_笔记_条款03_尽可能使用const
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 关键字const多才多艺,语法变化多端.关于const的基本用法 ...
- 读书笔记_Effective_C++_条款三:尽可能使用const
const是常量的意思,它可以定义一个不可改变的量,主要用于以下几个地方: 1. 修饰变量,使之不可改变 举个例子: const int var = 3; 此时var的值就不能改变了.也正是因为con ...
随机推荐
- 斐波那契博弈(Fibonacci Nim)
问题: 有一堆个数为n(n>=2)的石子,游戏双方轮流取石子,规则如下: 1)先手不能在第一次把所有的石子取完,至少取1颗: 2)之后每次可以取的石子数至少为1,至多为对手刚取的石子数的2倍. ...
- changepassword.c 0.9:一个通过WEB界面更改LINUX用户密码的程序
偶然看到一个用C语言写的CGI程序,可以以WEB界面(无需单独再写HTML)的方式修改用户自己的密码.该程序具有同时修改samba及squid密码的能力. 步骤: 1.下载并解压,并读一下README ...
- [Js]弹性运动
描述:像弹簧一样左右弹动,最后缓慢停下来 一.加减速运动 1.加速运动 var iSpeed=0;iSpeed++; 速度越来越快,最后冲出去 2.减速运动 var iSpeed=20;iSpeed- ...
- 在Win7下安装IIS
由于工作上的需要,有朋友在问在windows7系统下如何来配置IIS,大部分用户平时都很少接触到这个功能,所以对于安装配置十分陌生也是在所难免的,下面就让小编与你分享下windows7系统下IIS详细 ...
- (DFS)hdoj1175:连连看
题目链接 这道题被稍微改编当作过去年的期末上机题,也被直接放到了这次这一届的第二次练习赛.当初刚看到这道题时DFS并没有系统的学过,做起来极其费劲.现在学过之后开始实践练习,发现这道题真的是很水. 我 ...
- WebBrowers & HtmlViewers collection
WebBrowers & HtmlViewers collection 浏览: 加入我的收藏 楼主: THtmlViewerhttps://github.com/BerndGabriel/Ht ...
- php变量的判空和类型判断
(1)var_dump(); 判断一个变量是否已经声明并且赋值,并且打印类型和值 <?php $a; var_dump($a);//输出null <?php var_dump($a);// ...
- C/C++文件结构
总结者:kate (1).h 为头文件:存放 版权和版本声明,预处理块 ,函数和类结构声明 (2).cpp文件:代码文件,存放程序的实现 大都数时候,源文件和头文件是对应出现的,比如有一个A.cpp ...
- maven的入门hello world
编写pom pom.xml是maven的核心.Project Object Model,定义了项目的基本信息,用于描述项目如何构建,项目依赖等. 首先,新建hello-world文件夹,新建pom.x ...
- 破解Xamarin
试用了一阵子Mono For Android,今天到期了,,囊中羞涩,只好破解. 说是要在vs2013的英文界面下运行破解包,不知道是真是假,下载并安装了一个. 然后又下载了破解包.是个名为xa.ra ...