C++中const的一个很重要的作用就是把一个对象转换成一个常量。在程序中任何改变这个值的企图会被标记为编译错误。它被称为是“只读的”。

(1)const对象在定义的时候必须被初始化。未初始化的常量会引起编译错误。

原因是因为常量在定义之后就不能被修改,所以必须被初始化。

(2)不能将一个非const对象的指针指向一个const对象。

比如下面的代码:

const int constVal = 100;

int *intPtr = &constVal;//OK or ERROR?

是否会出错呢?

我们可以编写下面这行代码:

*intPtr += 1;

这样就修改了const型对象constVal的值。注意:一般编译器不能跟踪指针在程序中任意一点指向的对象。所以将一个非const对象的指针指向一个const对象会引起编译时刻错误。

(3)const对象的地址只能赋给指向const对象的指针。


(4)指向const对象的指针可以被赋予一个非const对象的地址。

例如下面的代码:

int iVal = 20;

const int *iPtr = &iVal;

但是我们不能通过iPtr解引用来修改iVal的值,虽然iVal不是常量。否则会引起编译错误。

在实际应用中,指向const对象的指针经常被用作函数的参数,作用是可以保证被传递给函数的实际对象子啊函数中不会被修改。

(5)const的使用

定义常量:

int const a = 1;和cons int a = 1;等价;

(6)当与指针放在一起使用的时候,就稍微有点复杂。

const int *intPtr;

我们可以从右往左看,它是指向常量int型的非const型指针。指针所指向的对象不可改变,但是指针本身是可以改变的。比如我们可以使它指向另外一个int型对象:

int a = 1;

intPtr = &a;

而:

int a = 1;

int *const intPtr = &a;

是常量指针,指向非const类型的int型变量。指针本身不可改变,即不可赋给它其他的地址值。但是可以修改intPtr所指向的对象的值:

*intPtr = 2;

视图给const指针赋值会引起编译错误:

int b = 3;

intPtr = &b;

const int a = 4;

const int *const cicp = &a;

这是指向const对象的const指针。指针所指向的值和指针本身都不可改变。

(7)const与引用在一起使用:

1、const引用可以用不同该类型的对象初始化(只要能从一个类型转化到另一种类型即可)。也可以是不可寻址的值如文字常量。

例如:

double dVal = 1.18;

const int &ir = 12;

const int &ir2 = dVal;

const double &dr = dVal = 1.0;

注意:同样的初始化对于非const引用是不合法的。

引用在内部存放的是一个对象的地址,它是该对象的别名。

对于不可寻址的值比如文字常量以及不同类型的变量,编译器为了实现引用,必须生成一个临时变量,引用实际上指向该临时变量。

例如:
double dVal = 12;

const int &ri = dVal;

编译器实际上将其转化为:

int temp = dVal;

const int &ri = &temp;

这样,如果我们给ri赋给一个新值,则不会改变dVal的值,改变的是temp。用户不会看到这一改变。

下面我们要用一个const对象的地址来初始化一个引用。

非const引用的定义是非法的,将导致编译时刻错误:
const int iVal = 12;

int *&pi = &iVal;

我们可能想进行如下修改:

const int *&pi = &iVal;

但是仍然不正确。因为引用pi是一个指向定义为const的int型对象的指针。我们的引用不是指向一个常量,而是指向一个非常量指针。正确定义如下:

int *const &pi = &iVal;

(8)const与typedef一起使用

一个有趣的问题:

typedef char *cstring;

extern const cstring cstr;

请问cstr的类型是什么?

很多人都会回答是const char*,即指向const字符的指针。但是这是错误的。错误地把typedef当做宏扩展了。在这里typedef并不是简单地宏扩展。

cstring在这里是个类型就像const int a中int是个类型一样。这里说明cstr是const类型的。而cstr是个指针,所以它是const型的指针,指向的是char型。

【C++基础学习】const限定修饰符详解相关推荐

  1. java访问修饰符详解——学java,零基础不怕,不只要理论,更要实践+项目,a href=http://www.bjweixin.com太原维信科技提供 /a...

    java访问修饰符详解--学java,零基础不怕,不只要理论,更要实践+项目 <a href=http://www.bjweixin.com>太原维信科技提供 </a> pub ...

  2. swift 基础学习之属性修饰符

    1,private private 访问级别所修饰的属性或者方法只能在当前类里访问. (注意:Swift4 中,extension 里也可以访问 private 的属性.) 原文:Swift - 访问 ...

  3. 《Java 核心技术卷1 第10版》学习笔记------ 控制可见性的4个访问修饰符详解

    1 ) 仅对本类可见 private. 2 ) 对所有类可见 public: 3 ) 对本包和所有子类[含非直系]可见 protected. 4 ) 对本包可见-默认(很遗憾,) 不需要修饰符. 这里 ...

  4. 扔物线Kotlin讲解学习(一)----Kotlin的权限修饰符详解

    Kotlin 中有四种可见性修饰符: public:公开,可见性最大,哪里都可以引用. private:私有,可见性最小,根据声明位置不同可分为类中可见和文件中可见. protected:保护,相当于 ...

  5. java 修饰符 详解,详解Java修饰符

    Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: 访问控制修饰符 Java中,可以使用访问控 ...

  6. Java访问控制修饰符详解

    在 Java 语言中提供了多个作用域修饰符,其中常用的有 public.private.protected.final.abstract.static.transient 和 volatile,这些修 ...

  7. Java访问控制修饰符详解( public、 private、protected 和 friendly)

    在 Java 语言中提供了多个作用域修饰符,其中常用的有 public.private.protected.final.abstract.static.transient 和 volatile,这些修 ...

  8. java final修饰符_java final修饰符详解,final修饰方法

    之前给大家讲过java final修饰符final修饰变量方面的知识,那么下面要继续给大家讲到的就是final修饰方法方面的知识,一起来了解一下吧. final修饰的方法不能被重写,假如因为一些原因, ...

  9. java的final修饰_java final 修饰符详解

    final修饰符究竟有什么作用,我们该如何使用,对我们的应用开发又能够起到什么作用,有java基础的肯定是不难说出final的几个用法, 1.被final修饰的变量在首次被初始化之后是不能够再次被赋值 ...

最新文章

  1. 使用python的while语句,编写简单门票与年龄计算器
  2. 单纯形 c语言 程序,单纯形法完全c语言程序
  3. java什么时候创建进程,Java创建进程
  4. 假如地球变成甜甜圈形状,世界会变成什么样子?
  5. 学徒学计算机,那个有能力的高人愿意收我做学徒啊,我是学计算机的
  6. iOS打开沙盒html,iOS WKWebView加载本地/沙盒HTML及css、images
  7. Ubuntu 15.10 默认壁纸?
  8. 在raspberry pi上使用自己的内核
  9. 5加载stm32 keil_STM32在SRAM、FLASH中调试代码的配置方法(附详细步骤)
  10. java cookbook中文版_Java Client快速入门指南
  11. [USACO08NOV]时间管理Time Management
  12. nova创建虚拟机源码分析系列之六 api入口create方法
  13. Pandas系列(十四)数据转换函数map、apply、applymap以及分组apply
  14. jQuery--表单校验
  15. 五笔输入法 快速入门 二小时基本了解五笔
  16. CAN报文解析—案例
  17. 2022-2027年中国实验室自动化行业市场调研及未来发展趋势预测报告
  18. python中py是什么意思_python中__init__.py是干什么的
  19. 概率论与数理统计学习笔记——第14讲——大数定律(1.切比雪夫不等式及切比雪夫大数定律)
  20. C#远程服务器返回错误: (500) 内部服务器错误

热门文章

  1. 华图砖题库php文件怎么打印_事业单位招聘考试《工会基础知识》试题库及答案1380题...
  2. win10 查看文件扩展名 - 教程篇
  3. elemenUI - 弹框组件alert - 宽度设置? - 疑问篇
  4. KuYun企业授权管理系统源码开源版
  5. WordPress病毒杂志主题King V6.5 英文Nulled版
  6. ImovieBox视频下载工具
  7. 保密 | 利用DOS命令将文本信息隐藏在图片中
  8. vue项目,cli-3.0项目部署运行报错:Uncaught SyntaxError: Unexpected token
  9. GoEasy小程序即时通讯源码 v1.1.0基于GoEasy提供的websocket通讯服务
  10. 网址导航网站源码 仿某菇导航V1.2版