3.2 const限定符

  • const的作用:替代#define作为有类型检查的常量来使用。他的值被初始化后就固定了,成为一个只读变量,不能更改。(推荐使用特殊的命名规范来区分常量和非常量)。
  • const的声明:const type name = value。需要在声明的时候赋值,如不赋值,那么常量的值是不确定的,并且无法修改。
  • const相对于#define的好处:
    • 有明确的类型
    • 可以嵌套进更复杂的类型
    • 可以限定使用区域

const用法扩展

面试一直会问道const的用法、原理等,索性趁回归基础总结一下。

  • const的基本作用:防止值被修改

  • 定义一个const对象const type name = value,声明常规变量一定要初始化,上文已经讲过。在类中声明一个const成员只能使用初始化列表进行初始化。

  • const的作用域: const默认的作用域是本文件。他能被本文件的对象访问,但只存在本文件中,不能被其他文件访问。如果想要在其他文件中也访问到这个const变量,需要在定义的时候加extern声明。如extern const x = a。在其他文件中使用extern const x进行访问。对于非const变量,定义时默认是extern类型的,const要额外声明

  • const引用:const引用是指向const对象的引用。

    • (非const引用无法引用const变量)由于const对象是不能修改的,如果使用int &ref = i,而i又是一个const变量,从引用上来说可以使用ref来修改i的值的,而i又不能修改,所以这里是非法的。
    • (const引用本身不能修改)const修饰的引用是也是一个常量,这个引用是不能更改的。
    • (const引用的对象是可以修改的)const引用可以指向非const变量,通过非const变量自身的修改来修改引用的结果,但是不能通过引用来修改,因为此时引用本身还是const类型的。
    • 非const引用应该指向非const变量
    • 非const变量只能绑定到同类型的引用中,const变量可以绑定不同但相关的类型。对于非const引用,类型不同不能绑定比较好理解。对于const引用,引用过程中会自发的进行类型的转换。如double d = 3.14;const int &ref2 = d;,系统用int tmp = d;const int &ref2 = temp;来实现const绑定类型不同的变量。
  • const引用示例代码:

const int test1 = 1;
const int test2 = 2;
int test3 = 3;
int test4 = 4; int &ref = test3;
ref += 1;
cout << test3 << endl;
//1.引用修改非const对象的值 const int &t1 = test1;
cout << t1 << endl;
// 2.t1 = test2; 报错,const引用无法修改(read only) const int &t3 = test3;
cout << t3 << endl;
test3 += 1;
cout << t3 << endl;
// t3 += 1; // 错误,引用本身无法修改
// 3.可以指向非const变量,非const变量可以修改。 // 4.int &t4 = test2; 报错,非const引用无法指向const常量 double test5 = 5.0;
// int &t5 = test5; 报错,无法用 "double" 类型的值初始化 "int &" 类型的引用
const int &t5 = test5;
cout << t5 << endl;
// 5. 非const变量只能绑定到同类型的引用中,const变量可以绑定不同但相关的类型
  • const指针:const指针广义上来讲,是带有const关键字的指针变量,主要有下面三种:

    • const int * p / int const *p const修饰的是*p 这两个是一个意思,就是指向int类型常量的指针,指针的地址(指向)是可以任意改的,但是不能通过指针来修改所指向的值,因为指向的是一个常量。
    • int * const p const直接修饰地址p,指的是p是一个常量指针,指向整型变量。p本身的地址(指向)是无法修改的,而p所指向的是一个变量值,是可以修改的。
    • int const int * const p; / int const * const p; 这个是上面两者的结合,指针本身和指向的值都不能更改。
  • const指针示例代码:

    int a = 10;
const int b = 20;
const int *p = &a;
const int *q = &b;
// *p = 11; 报错,不能通过指针修改。
cout << *p << " - " << *q << endl;
q = p;
a = 30;
cout << *p << " - " << *q << endl;
/* 解释:
const int *q 指的是指向的地址可以改,指向的值不能改(*p=11非法).
const 修饰的目标是int *q,也就是q所指向的值,所以再给q赋值是非法的。
const int *q可以指向变量或常量,然而不能通过q这个指针去修改指向的值,
但是如果指向的是一个变量,变量本身是可以重新赋值的,只是不能通过指针去修改。
*/ int *const x = &a;
// int *const y = &b; 报错,不能指向常量
int c = 11;
// x = &c; 报错,常量地址不能修改
cout << *p << " - " << *q << endl;
/* 解释:
int * const x 表示x地址是一个常量,它必须指向一个固定的地址。但是地址里面
的值是可以改变的,所以int * const x不能指向一个常量。它只是限制你的地址不能
改变而已。
*/

Chapter03 第二节 const限定符的使用的更多相关文章

  1. C++ Primer 第二章 引用 指针 const限定符

    1.引用: 为对象起了另外一个名字,引用类型引用另外一种类型,通过将声明符写成&d的形式来定义引用类型,其中d也就是声明的变量名(声明符就是变量名). PS:1.通过图片中编译所提示的报错信息 ...

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

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

  3. C++const限定符

    在C语言中我们使用#define宏定义的方式来处理符号常量.而在C++中有一种更好的处理符号常量的方法,那就是使用const关键字来修改变量声明和初始化.这种处理常量方式的好处不言而喻:如果程序在多处 ...

  4. const 限定符

    1.定义const对象 const限定符把一个对象转换成一个常量 const int Bufsize = 512; 定义Bufsize 为常量并初始化为512.变量Bufsize仍然是一个左值,但是不 ...

  5. C++杂谈(一)const限定符与const指针

    const限定符 c++有了新的const关键字,用来定义常变量,可以替C语言中的#define.关于const限定符,有以下需要注意: 1.创建后值不再改变 2.作用范围在文件内有效 3.添加ext ...

  6. 指针和Const限定符

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

  7. C++ const 限定符

    C++ const 限定符 作用:把一个对象转换成一个常量 用法:const type name = value; 性质:1. 定义时必须初始化,定义后不能被修改.2. 类中的const成员变量必须通 ...

  8. const限定符的作用

    const限定符的作用:                                     1.定义const常量:const可以将一个对象变成一个常量,不可被修改,所以定义的 时候必须进行初始 ...

  9. C++之const限定符

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

随机推荐

  1. Gitlab+Jenkins+Docker实现net core持续集成

    前言 在项目中使用这一套自动集成的体系之后,一直想找个时间总结出来,用于自己记录也打算将自己的所得分享给园友们,不经常写文章,可能会有错误的地方,希望各位不吝指正,我会及时的改正并表示感谢,希望大家能 ...

  2. Hystrix——让你的服务更稳一点

    摘要: 1.为什么要用Hystrix在分布式服务环境下,服务之间的调用关系变得错综复杂,你是否担心依赖的服务延迟导致自己的服务也被拖跨呢?是否在苦苦思考如何优雅的对依赖服务进行异步调用呢?是否希望当流 ...

  3. 对0.5px的边的研究--------------引用

    什么是像素? 像素是屏幕显示最小的单位,在一个1080p的屏幕上,它的像素数量是1920 1080,即横边有1920个像素,而竖边为1080个.一个像素就是一个单位色块,是由rgba四个通道混合而成. ...

  4. 《Spring源码深度解析》二

    第二章:容器的基本实现 2.1 基本用法 首先定义一个Bean:(假设在bean包下) 然后定义配置文件: 测试类: 当然,这并非是企业级用法,此处只是用来分析学习其实现 2.2 功能分析 上述三图代 ...

  5. LeeCode - 移动零

    给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序. 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组上操作, ...

  6. LeetCode - 不邻接植花

    有 N 个花园,按从 1 到 N 标记.在每个花园中,你打算种下四种花之一. paths[i] = [x, y] 描述了花园 x 到花园 y 的双向路径. 另外,没有花园有 3 条以上的路径可以进入或 ...

  7. html br标签 语法

    html br标签 语法 br标签什么意思? 作用:插入一个简单的换行符.广州大理石机械构件 说明:<br> 标签是空标签(意味着它没有结束标签,因此这是错误的:<br>< ...

  8. html a标签 语法

    html a标签 语法 作用:<a> 标签定义超链接,用于从一张页面链接到另一张页面. 直线电机滑台 说明:<a> 元素最重要的属性是 href 属性,它指示链接的目标.在所有 ...

  9. EventArgs

    序言 DataEventArgs<DataSet> arg = new DataEventArgs<DataSet>(ds); 事件总线 什么是事件总线 我们知道事件是由一个P ...

  10. FZU 2203 单纵大法好 (二分 && 贪心)

    题意 : 老S最近喜欢上某个搜集战舰的游戏,这个游戏中很重要的一个内容是能编排自己的战舰,通过出击完成任务来获取资源或新的战舰.大家都说老S是一个“直男”,所以他喜欢把战舰排成一条直线.目前老S正准备 ...