1.问题引入

<span style="font-size:18px;"><span style="font-size:18px;">for( int index =0; index != 512; ++ index){//......</span></span>

上面的for循环代码有两个问题,都和512作为循环上界有关。

第一个问题是程序的可读性。比较index和512有什么意义呢???循环在做什么工作呢???也就是说512是什么东西呢???在本例中,512被称为魔数(magic number),它的意义在上下文中没有体现出来,好像这个数是魔术般地从空中出现的。‘
第二个问题是程序的可维护性。假设这个程序非常庞大,512出现了100次。进一步假设在这100次中,有80次是表示某一特殊缓冲区的大小,剩余20次是用于其它的目的。现在我们需要把缓冲区的大小增大到1024。要实现这一改变,必须检查每个512出现的位置。此时我们就要仔细勘察哪一处表示缓冲区,哪一处表示其他目的,要知道,错改一处,都会造成程序的崩溃!!!
解决这两个问题的方法是使用一个初始化为512的对象:
<span style="font-size:18px;">int bufSize = 512; // input buffer size
for(int index = 0; index != bufSize; ++index){//......
}</span>

我们可以看出,现在是对对象bufSize测试,而不是字面值常量512测试。

2.为什么我们需要const?

定义一个变量代表某一常数的方法仍然有一个严重的问题。即 bufSize 是可以被修改的。bufSize 可能被有意或无意地修改。const 限定符提供了一个解决办法,它把一个对象转换成一个常量。

<span style="font-size:18px;">const int bufSize = 512; //input buffer size</span>

定义bufSixe为常量并初始化为512.变量bufSize仍然为一个左值。但是现在这个左值是不可以修改的,修改任何的bufSize的尝试都会导致编译错误。

<span style="font-size:18px;">bufSize = 0; // error: attemp to write to const object</span>

因为常量定义后就不能被修改,所以定义时必须初始化!!!

<span style="font-size:18px;">const std::string hi = "hello";// ok:innitialized
const int i,j=0;//error:i is uninitialized const</span>

3.const对象默认为文件的局部变量

在全局作用域里定义非 const 变量时,它在整个程序中都可以访问。我们可以把一个非 const 变更定义在一个文件中,假设已经做了合适的声明,就可在另外的文件中使用这个变量:
<span style="font-size:18px;">// file_1.cc
int counter; // defination
// file_2.cc
extern int counter; // uses counter from file_1
++counter; //increments counter defined in file_1</span>

与其他变量不同,除非特别说明,在全局作用域声明的 const 变量是定义该对象的文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问

<span style="font-size:18px;">// file_1.cc
// defines and initialize a const that is accessible to other files
extern const int bufSize = fcn();
// file_2.cc
extern const int bufSize; // uses bufSize from file_1
for(int index = 0; index != bufSize; ++ index){//......
}</span>

在上述程序中,file_1.cc通过函数fcn的返回值来定义和初始化bufSize。而bufSize又被定义为外部类型extern,这就意味着bufSize可以再其他的文件中被使用。file_2.cc中bufSize同样声明为外部类型extern;不能被初始化。

区别:非const变量会被自动默认为extern。而要使const变量能够在其他的文件中访问,必须制动他为extern。

C++primer :const限定符相关推荐

  1. C++primer第二章2.4节对于const限定符相关内容进行详解

    const限定符 const对象一旦创建后其数值就不会被再次改变,因此const对象必须初始化. const对象只在文件中有效 在不同的文件中使用不同的const来定义不同的常量,那么每个文件定义的变 ...

  2. 【C++学习笔记】复合类型和const限定符

    一.复合类型   复合类型(compound type)是指基于其他类型定义的类型.本次主要介绍引用和指针两种. 1.1 引用   引用(reference)为对象起了另外一个名字,引用类型引用(re ...

  3. C++ 语法 const限定符

    const限定符是常用且容易混淆的概念,很多书中讲解不清晰,甚至<C++ primer>中都有一些错误的论断或者不明确的区分,本文对const限定符做归纳总结. 一.在类型中 顶层cons ...

  4. 指针和Const限定符

    指针和Const限定符 1.指向const对象的指针 如果指针指向的是const对象,则不允许使用指针来改变其所指的const值.C++要求指向const对象的指针具有const特性. const d ...

  5. php+条件限定符,const 限定符

    const 限定符 const 对象一旦创建后不可改变,所以const必须初始化. const int i=get_size(); //运行时初始化 const int j=43; const int ...

  6. C++的const限定符

    const限定符总是让人很头疼,下面讲解一下几个比较容易混淆的概念: 对常量的引用(常量引用): 一般情况下,引用的类型要与其所引用的对象的类型一致,其中的例外情况就是,当初始化常量引用时,允许用任意 ...

  7. 指针、引用以及const限定符、constexpr限定符

    文章目录 复合类型 引用 概念与使用 引用的定义 注意 指针 概念 声明方式 取地址符 指针值 空指针 利用指针访问对象 赋值和指针 void* 指针 指向指针的指针 指向指针的引用 初始化所有指针 ...

  8. C++ const限定符和auto类型说明符

    const限定符 # 1.限定常量 有时我们希望定义这样的变量:它的值不能被改变.为了满足这一要求,我们使用const对变量的类型加以限定: const int bufSize = 512; 这样就把 ...

  9. c++ const限定符

    const限定符 const对像一旦创建,其值就不能发生改变.const对象必须初始化 const int i = get_size();//正确,运行时初始化. const int j = 1;// ...

最新文章

  1. python+selenium百度贴吧自动签到
  2. object.create()
  3. R语言tidyr包pivot_longer函数、pivot_wider函数数据表变换实战(长表到宽表、宽表到长表)
  4. 20天持续压测,告诉你云存储性能哪家更强?
  5. Vertical Menu ver4
  6. LESSON 12.1-12.6 梯度提升树的基本思想梯度提升树的参数
  7. 斯坦福大学机器学习第四课“逻辑回归(Logistic Regression)”
  8. maven 文件上传下载_使用Maven将文件上传和下载到S3
  9. 科研人看过来!2021腾讯AI Lab犀牛鸟专项研究计划开始申请
  10. MapBar和MapInfo中的比例尺[更新:MapBar比例尺是正确的]
  11. 10年前腾讯微信后台第一天提交的代码曝光;苹果App Store佣金抽成再做让步;TypeScript 4.1发布|极客头条...
  12. 《Java并发编程实践》学习笔记之二:线程安全性(thread-safe)
  13. Leetcode刷题95. 不同的二叉搜索树 II
  14. 中国计算机学会推荐国际学术会议和期刊目录(2019,最新)
  15. 【mcuclub】MQ系列气体传感器
  16. cocos2d-html5教程之重要概念
  17. 虹科AR智能眼镜是什么?好用吗?
  18. 【R语言】【1】初学R语言语法使用Rstudio编辑
  19. 面试题,移动端APP测试常见bug记录
  20. Qt: Linux下生成.xlsx文件(excel表格文件)

热门文章

  1. getElementsByName 的应用,获取组的选择值
  2. 保定linux第一版PPT-SVN for Linux
  3. Python中的三引号的用法
  4. NYOJ 28 大数阶乘
  5. NYOJ 982 Triangle Counting (数学题)
  6. 教你查看Windows 7的详细系统版本号
  7. source insight和vim同时使用
  8. Linux学习笔记 -- 文本编辑器之 vi与vim
  9. ubuntu16安装anaconda显示没有文件或那个目录
  10. Windows 下安装Pytorch