【C++基础学习】const限定修饰符详解
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限定修饰符详解相关推荐
- java访问修饰符详解——学java,零基础不怕,不只要理论,更要实践+项目,a href=http://www.bjweixin.com太原维信科技提供 /a...
java访问修饰符详解--学java,零基础不怕,不只要理论,更要实践+项目 <a href=http://www.bjweixin.com>太原维信科技提供 </a> pub ...
- swift 基础学习之属性修饰符
1,private private 访问级别所修饰的属性或者方法只能在当前类里访问. (注意:Swift4 中,extension 里也可以访问 private 的属性.) 原文:Swift - 访问 ...
- 《Java 核心技术卷1 第10版》学习笔记------ 控制可见性的4个访问修饰符详解
1 ) 仅对本类可见 private. 2 ) 对所有类可见 public: 3 ) 对本包和所有子类[含非直系]可见 protected. 4 ) 对本包可见-默认(很遗憾,) 不需要修饰符. 这里 ...
- 扔物线Kotlin讲解学习(一)----Kotlin的权限修饰符详解
Kotlin 中有四种可见性修饰符: public:公开,可见性最大,哪里都可以引用. private:私有,可见性最小,根据声明位置不同可分为类中可见和文件中可见. protected:保护,相当于 ...
- java 修饰符 详解,详解Java修饰符
Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: 访问控制修饰符 Java中,可以使用访问控 ...
- Java访问控制修饰符详解
在 Java 语言中提供了多个作用域修饰符,其中常用的有 public.private.protected.final.abstract.static.transient 和 volatile,这些修 ...
- Java访问控制修饰符详解( public、 private、protected 和 friendly)
在 Java 语言中提供了多个作用域修饰符,其中常用的有 public.private.protected.final.abstract.static.transient 和 volatile,这些修 ...
- java final修饰符_java final修饰符详解,final修饰方法
之前给大家讲过java final修饰符final修饰变量方面的知识,那么下面要继续给大家讲到的就是final修饰方法方面的知识,一起来了解一下吧. final修饰的方法不能被重写,假如因为一些原因, ...
- java的final修饰_java final 修饰符详解
final修饰符究竟有什么作用,我们该如何使用,对我们的应用开发又能够起到什么作用,有java基础的肯定是不难说出final的几个用法, 1.被final修饰的变量在首次被初始化之后是不能够再次被赋值 ...
最新文章
- 使用python的while语句,编写简单门票与年龄计算器
- 单纯形 c语言 程序,单纯形法完全c语言程序
- java什么时候创建进程,Java创建进程
- 假如地球变成甜甜圈形状,世界会变成什么样子?
- 学徒学计算机,那个有能力的高人愿意收我做学徒啊,我是学计算机的
- iOS打开沙盒html,iOS WKWebView加载本地/沙盒HTML及css、images
- Ubuntu 15.10 默认壁纸?
- 在raspberry pi上使用自己的内核
- 5加载stm32 keil_STM32在SRAM、FLASH中调试代码的配置方法(附详细步骤)
- java cookbook中文版_Java Client快速入门指南
- [USACO08NOV]时间管理Time Management
- nova创建虚拟机源码分析系列之六 api入口create方法
- Pandas系列(十四)数据转换函数map、apply、applymap以及分组apply
- jQuery--表单校验
- 五笔输入法 快速入门 二小时基本了解五笔
- CAN报文解析—案例
- 2022-2027年中国实验室自动化行业市场调研及未来发展趋势预测报告
- python中py是什么意思_python中__init__.py是干什么的
- 概率论与数理统计学习笔记——第14讲——大数定律(1.切比雪夫不等式及切比雪夫大数定律)
- C#远程服务器返回错误: (500) 内部服务器错误
热门文章
- 华图砖题库php文件怎么打印_事业单位招聘考试《工会基础知识》试题库及答案1380题...
- win10 查看文件扩展名 - 教程篇
- elemenUI - 弹框组件alert - 宽度设置? - 疑问篇
- KuYun企业授权管理系统源码开源版
- WordPress病毒杂志主题King V6.5 英文Nulled版
- ImovieBox视频下载工具
- 保密 | 利用DOS命令将文本信息隐藏在图片中
- vue项目,cli-3.0项目部署运行报错:Uncaught SyntaxError: Unexpected token
- GoEasy小程序即时通讯源码 v1.1.0基于GoEasy提供的websocket通讯服务
- 网址导航网站源码 仿某菇导航V1.2版