2-2 理解const
1 const
- 在引用中注意不能为常量绑定一个非常量的引用
- 在指针中区分
low-level const和top-level const
const通常用于定义常量,一经定义不许修改,且使用const必须初始化
情形一
当我们在使用某个函数时,不希望变量在函数内部被改变,则可以将形参定义为const形式
void function (const int value)
情形二
const和引用放在一起使用时要注意,常量值不可以绑定到非常量的引用上,但是非常量可以绑定到常量的引用上。
non-const -> const
const !-> non-const
非常量值绑定到常量类型的引用是因为编译器帮我们产生了一个const类型的临时变量,比如:
int i=1;
const int &value=i;
//编译器行为
const int temp=i;
const int &value=temp;
情形三
如果我们需要一个指针指向常量时,那么这个指针也必须是常量类型,否则编译器会报错。另外在C++ Primer中我们可以看到low-level const和top-level const这样的概念,通过一个例子来理解
const int value=123;//top-level
const int *pvalue=&value;//low-level
*pvalue=456; //错误
const int value=123;
const int *pvalue=&value;
int vol_value=456;
pvalue=&vol_value;//正确
这里注意在第一段的程序里const修饰的并不是pvalue,而是外面的int部分,这里应该理解为一个指针pvalue指向const int类型,即它的指向类型不能变。由于其所指地址是常量属性,常量不允许被修改,所以会报错,但是指针pvalue还是可以改变所指方向的。
那么如果我们不希望指向常量的指针被修改,那么就应该让它成为top-level const,它所修饰的就是指针这个对象了,即如下所示
const int *const pvalue
区分top-level还是low-level并不是说看const在里面还是在外面,而是看他所修饰的是什么。对于指针这样的复合类型来说,如果修饰的是一个对象,那就是top-level,如果修饰的是基本类型,那就是low-level了
2-2 理解const的更多相关文章
- 【转】深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p
一.可能的组合: (1)const char*p (2)char const*p (3)char *const p(4)const char **p (5)char const**p (6)char ...
- 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p
由于没有const*运算,const实际上修饰的是前面的char*,但不能在定义时转换写成 const(char *)*p,因为在定义是"()"是表示函数. 三.深入理解7种组合 ...
- 理解-const
c++ 中const和c中define的区别 (1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. (2) 类型和安全检查不同 define宏没有类型,不 ...
- 我所理解的readonly和const
最近要给学校软件小组新成员讲几次课,所以把很多以前懒得学习的和模糊不清的知识点,重新学习了一下. MSDN是这样解释的: readonly 关键字与 const 关键字不同. const 字段只能在该 ...
- 深入理解C++中的Const,Mutable以及Volatile
我一直认为const表示一个常量,常量就是一个无法被修改的值,但是没有深入理解const的实现,甚至不知道mutable和volatile的存在,最近在书中看到了这一部分的知识,所以本文将详细解析这几 ...
- const的理解、const指针、指向const的指针
1.const 的理解 const 是C语言的一个关键字,需要注意的是,const 关键字是把变量变为一个只读的变量(也就是不可以作为左值),绝对不是将这个变量变为常量.也就是说经过const 修饰的 ...
- Const关键字
const const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性.另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程 ...
- C#中Const和Readonly的区别
const 的概念就是一个包含不能修改的值的变量.常数表达式是在编译时可被完全计算的表达式.因此不能从一个变量中提取的值来初始化常量.如果 const int a = b+1;b是一个变量,显然不能再 ...
- c++ static及const(开发者在线)
static 是c++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因.作用谈起,全面分析static 修饰符的实质. static 的两大作用: 一. ...
- const 与指针
深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p ...
随机推荐
- ThinkPHP3.2设置异常页面404跳转
在ThinkPHP3.2版本中当我们访问不存在的页面时会出现非常不友好错误提示页面. 解决办法: 1.在ThinkPHP3.2详细的介绍了该框架下的ThinkPHP惯例配置文件convention.p ...
- Typora怎么让左边的标题折叠
点击文件选择偏好设置->在选择外观->选中侧边栏的大纲视图允许折叠和展开 效果
- Html5本地存储概念,有什么优点,与cookie有什么区别?
html5中的Web Storage包括了两种存储方式:sessionStorage和localStorage sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有 ...
- Spring-动力节点
一.Spring启示录 阅读以下代码: package com.powernode.oa.controller; import com.powernode.oa.service.UserService ...
- ZSTUOJ刷题11:Problem D.--零起点学算法106——首字母变大写
Problem D: 零起点学算法106--首字母变大写 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 18252 Solved: 5211 Descr ...
- python机器学习——kmeans聚类算法
背景与原理: 聚类问题与分类问题有一定的区别,分类问题是对每个训练数据,我给定了类别的标签,现在想要训练一个模型使得对于测试数据能输出正确的类别标签,更多见于监督学习:而聚类问题则是我们给出了一组数据 ...
- 标准c++中string类函数介绍
之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是 ...
- Java字符串的一些函数方法
一.substring()方法 String str="123456"; String s1=str.substring(2); //s1="3456" Str ...
- fpga 通过vga模块使电脑显示图片
对vga模块搞了好几天,vga接口时序不难,就是行计数,列计数,对应到每一个像素上去.这里我先把vga控制模块的程序付上.采用的是小梅哥的程序.屏幕是800X600,配置的时钟是40M.注意改变屏幕尺 ...
- vue+element 表格动态列添加点击事件与排序(/或者空值排最后)
<template> <div> <el-table ref="tableData" :data="tableData& ...