const对象一旦创建后,其值就不可以改变,所以const对象必须初始化。与非const的类型比较,主要区别在于const类型对象执行但是不改变其操作内容。

在默认状态下,const只在文件内有效。在默认状况下,const定义的对象仅限定在文件类起作用,当多个文件中出现了同名的const时其实等同于在不同文件中分别定义了独立的变量。于是我们只在一个文件中定义const对象,而在其他文件中仅仅声明就可以。对于const对象不管是声明还是定义都加extern关键字,这样只需要定义一次就可以了。如下:

//在file1.h文件里面定义i

extern const int i=3;    //将i定义为常量3

//在file2.h中引用i时只要声明就可以,避免重定义

extern const int i;

int a=i;   //这样就可以使用i了

const的引用被称为对常量的引用(reference to const),引用类型必须与其所引用的对象保持一致,但是在这里有两个例外,第一个例外是在初始化常量引用时允许用任意表达式作为初始值。允许为一个常量引用绑定非常量对象,字面值,甚至是一个表达式:

int i=42;

const int &r1=i;    //正确,此时r1与i绑定

const int &r2=42;  // 正确,此时绑定一个字面值42

const int &r3=r1*2;  //正确,r3是一个常量引用,绑定字面值84

int &r4=42;    //错误,非常量引用不可绑定字面值

指向常量的指针不可以用于改变它所指的对象的值。要想存放指向常量的地址,必须使用指向常量的指针。

const int i=9;

int *p1=&i   //错误,不可以用一个普通指针指向一个常量

const int*p2=&i;  //正确,用常量指针指向常量

*p2=5;   //错误,常量指针不可以改变所指向位置的值

常量指针(const pointer)必须初始化,一旦初始化完成,它指向的位置(存放的地址)就不在改变。

int i=4;

int j=5;

int *const p=&i;   //p将一直指向i,p是一个常量指针

const int*p1=&j;  //p1是一个指向常量的指针,注意const的位置

const的限定的更多相关文章

  1. C++之const限定符

    作者:tongqingliu 转载请注明出处: C++之const限定符 const初始化 const的特点: 用const加以限定的变量,无法改变. 由于const对象定义之后就无法改变,所以必须对 ...

  2. C++之const限定符(顶层const,底层const)

    作者:tongqingliu 转载请注明出处:http://www.cnblogs.com/liutongqing/p/7050815.html C++之const限定符(顶层const,底层cons ...

  3. 简谈const限定符

    const修饰的数据类型是常量类型,常量类型的对象和变量在定义初始化后是不能被更新的.其实只用记住这一个概念,就可以明白const操作对象的方法. 1)定义const常量 最简单的: const in ...

  4. [C/C++]const限定符总结

    const限定符 const是一种限定符,被const所限定的变量其值不可以被改变. const的初始化 由于const一旦创建其值就不能够被改变,所以我们必须对其进行初始化 const int a; ...

  5. c++ const放置的位置

    标准中int const a 与 const int a 是完全等价的.正因为如此,会有很多各种不同的风格,同样的还有"*是跟类型还是变量?",比如char* p与 char *p ...

  6. C语言 const常量讲解

    //const的本质 //const本质上是伪常量,无法用于数组初始化以及全局变量初始化 //原因在于const仅仅限定变量无法直接赋值,但是却可以通过指针间接赋值 //例如局部常量在栈区,而不在静态 ...

  7. 【转】const 是左结合的,若左边为空,则再向右结合

    const 是左结合的,若左边为空,则再向右结合 一.指向  const  对象的指针指向  const  对象的指针,指的是指针指向的对象的内容是const的,不可修改,但指针本身(即指针的值)是可 ...

  8. C++学习之const整理总结

    1什么是const? (const类型)常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的.(但可以偷梁换柱进行更新) 2为什么引入const? const 推出的初始 ...

  9. c++ 学习之const专题之const成员函数

    一些成员函数改变对象,一些成员函数不改变对象. 例如: int Point::GetY() { return yVal; } 这个函数被调用时,不改变Point对象,而下面的函数改变Point对象: ...

随机推荐

  1. ruby 发送邮件

    产品构建.打包.部署完需要发送邮件通知相关人员进行验证.请看过程 #encoding:utf-8 require 'mail' #~ branch = ARGV.to_s.sub('[','').su ...

  2. Event Loop详解

    1.进程,单线程与多线 进程: 运行的程序就是一个进程,比如你正在运行的浏览器,它会有一个进程. 线程: 程序中独立运行的代码段. 一个进程由单个或多个线程组成,线程是负责执行代码的. 2.单线程与多 ...

  3. ceoi2017 Building Bridges(build)

    Building Bridges(build) 题目描述 A wide river has nn pillars of possibly different heights standing out ...

  4. 解决ie8下页面刚出现时候的晃动问题

    出现这个问题的原因的页面的高度超过一屏,这个时候需要在开始的时候给 html,body {overflow:scroll;overflow-x:hidden}; 这样就可以解决这个问题了

  5. [vuex] vuex requires a Promise polyfill in this browser报错问题的解决办法

    在IE下由于不支持promise而导致的问题,需要插件babel-prolyfill cnpm i bablel-prolyfill -D 接着在webpack.config.js当中进行配置 ent ...

  6. HDU 4388 Stone Game II {博弈||找规律}

    Stone Game II Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  7. POJ 2168 Popular cows [Tarjan 缩点]

                                                                                                         ...

  8. C#设计模式视频教程(不知道讲的好不好,刚刚看到)

    原文发布时间为:2008-12-08 -- 来源于本人的百度文章 [由搬家工具导入] http://u.youku.com/user_video/uid_happyboy27.html 优酷网。。

  9. hdu 3061 hdu 3996 最大权闭合图 最后一斩

    hdu 3061 Battle :一看就是明显的最大权闭合图了,水提......SB题也不说边数多少....因为开始时候数组开小了,WA....后来一气之下,开到100W,A了.. hdu3996. ...

  10. LeetCode OJ-- Sudoku Solver ***

    https://oj.leetcode.com/problems/sudoku-solver/ 九宫格数独问题. 一行上为1 2 3 到9 一列上为1 2 3 到9 每个小的3*3格子为 1 2 3 ...