1.const 对象必须初始化,因为一旦创建后值不能改变。

Eg:

  const int i = GetSize(); //正确:运行时初始化

  const int j = 42;   //正确:编译时初始化

  j = 33;   //错误:试图向const对象写值

  const int k;         //错误:k是一个未经初始化的常量

2.默认状态下,const对象仅在文件内有效。

若想在多个文件内工作,只在一个文件中定义const,而在其他多个文件中声明并使用它。

解决办法,对于const变量,不论声明定义都加extern,这样只需定义一次即可。

Eg:

  //file1.cc 定义并初始化一个常量,该常量能被其他文件访问

  Extern const int bufSize = fcn();

  //file1.h

  Extern const int bufSize; //与file1.cc 中定义的bufSize是同一个

3.把引用绑定到const对象上,称之为 对常量的引用

Eg1:

  const int c = 1024;

  const int &r1 = c;    //正确

  r1 = 42;       //错误:r1是对常量的引用

  int &r2 = c;       //错误:试图让一个非常量引用指向一个常量引用

Eg2:  int i = 42;

const int &r1 = i; //允许将const int& 绑定到一个普通int上

const int &r2 = 42;    //正确:r2是一个常量引用

const int &r3 = r1*2;   //正确:r3是一个常量引用

int &r4 = r1 * 2;      //错误:r4是一个普通的非常量引用

对const引用可能引用一个非const对象

Eg:   int i = 42;

int &r1 = i;

const int &r2 = i; //r2绑定对象i,但不允许通过r2修改i值

r1 = 0; //r1并非常量,i的值为0

r2 = 0; //错误:r2是一个常量引用

引用一个非const对象,即对象是个非常量,所以允许通过其他途径改变其值。

4.const指针

指针是对象,允许把指针本身定为常量。常量指针必须初始化,则指针的值(存放指针中的地址)不能再改变了。

把*放在const前,用以说明指针是一个常量,即不变的是指针本身而非指向的值。

Eg: int errNumb = 0;

int *const curErr = &errNumb; //curErr将一直指向errNumb

const double pi = 3.14159;

const double *const pip = π   //pip指向常量对象的常量指针

从右往左读:

①离curErr最近的是const,意味着curErr本身是一个常量对象。

②下一个是*,curErr是一个常量指针。

③int:常量指针指向一个int对象

同理,pip是一个常量指针,指向一个双精度浮点型常量。

指针本身是一个常量并不意味着不能通过指针修改其所指对象的值。

Eg:分析int const *p,  const int*p,  int *const p , const int *const p的异同之处

int const *p,  const int*p这两个没区别,p指向的地址可变,p指向的内容不可变,

int *const p , p指向的地址不可变,p指向的内容可变

const int *const p  p指向的地址不可变,p指向的内容不可变

5.顶层const

顶层const 表示指针本身是个常量。

底层const 表示指针所指的对象是一个常量。

Eg:int i = 0;

  int *const p1 = &i; //不能改变p1值,顶层

  const int ci = 42; //不能改变ci值,顶层

  const int *p2 = &ci;     //允许改变p2值,底层

  const int *const p3 = p2;    //靠右的const顶层,靠左底层

  const int & r =ci; //用于声明引用的const都是底层const

执行对象拷贝操作:

顶层const不受影响:不会改变被拷贝对象的值,无影响。

Eg: i = ci; //正确:拷贝ci值,ci顶层const,无影响

p2 =p3; //正确:p2 p3指向对象类型相同。p3顶层const的部分不影响

底层const 限制不可忽略:执行对象拷贝操作,拷入拷出对象必须具有相同底层const资格,或者两个对象的数据类型必须能够转换。一般,非常量可以转换成常量,反之不行。

Eg: int *p = p3; //错误:p3包含底层const,p1无

p2 = p3; //正确:p2 p3 都是底层const

p2 = &i; //正确:int * 能转换成 const int *

int &r = ci; //错误:试图让一个非常量引用指向一个常量引用

const int &r2 = i; //正确:r2绑定对象i,但不允许通过r2修改i值

          //(对const引用可能引用一个非const对象)

const in C/C++的更多相关文章

  1. openssl 1.1.1 reference

    openssl 1.1.1 include/openssl aes.h: # define HEADER_AES_H aes.h: # define AES_ENCRYPT 1 aes.h: # de ...

  2. const,static,extern 简介

    const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...

  3. C++中的const

    一,C++中const的基本知识 1.C++中const的基本概念 1.const是定义常量的关键字,表示只读,不可以修改. 2.const在定义常量的时候必须要初始化,否则报错,因为常量无法修改,只 ...

  4. const extern static 终极指南

    const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ...

  5. const let,console.log('a',a)跟console.log('a'+a)的区别

    const 创建一个只读的常量 let块级作用域 const let重复赋值都会报错 console.log('a',a) a console.log('a'+a) a2 逗号的值会有空格:用加号的值 ...

  6. es6之let和const

    在javascript中,我们都知道使用var来声明变量.javascript是函数级作用域,函数内可以访问函数外的变量,函数外不能访问函数内的变量. 函数级作用域会导致一些问题就是某些代码块内的变量 ...

  7. construction const parameter问题 构造函数const引用参数问题

    工程在window下编译没有任何问题, 但是在linux(CentOS6)下编译就老是报错 C++ 编译器已升级到最新版 6.1.0 错误如下: In file included /bits/stl_ ...

  8. Error:const char* 类型的实参和LPCWSTR类型的形参不兼容的解决方法。

    在C++的Windows 应用程序中经常碰到这种情况. 解决方法: 加入如下转换函数: LPCWSTR stringToLPCWSTR(std::string orig) { size_t origs ...

  9. C#基础知识七之const和readonly关键字

    前言 不知道大家对const和readonly关键字两者的区别了解多少,如果你也不是很清楚的话,那就一起来探讨吧!探讨之前我们先来了解静态常量和动态常量. 静态常量 所谓静态常量就是在编译期间会对变量 ...

  10. const 与 readonly知多少

    原文地址: http://www.cnblogs.com/royenhome/archive/2010/05/22/1741592.html 尽管你写了很多年的C#的代码,但是可能当别人问到你cons ...

随机推荐

  1. 解决 libnanomsg.so.0: cannot open shared object file: No such file or directory 无法找到libnanomsg动态链接库

    参考: [11]缺少动态连接库.so--cannot open shared object file: No such file or directory Importing Issues: cann ...

  2. Flume NG初次使用

    一.什么是Flume NG Flume是一个分布式.可靠.和高可用性的海量日志采集.聚合和传输的系统,支持在日志系统中定制各类数据发送方,用于收集数据:同时Flume提供对数据的简单处理,并写到各种数 ...

  3. go-ipfs入门及介绍

    1.go-ipfs安装 参考: https://mp.weixin.qq.com/s?__biz=MzUwOTE3NjY3Mw==&mid=2247483734&idx=1&s ...

  4. 使用httpclient提交表单数据加号(+)会被自动替换成空格的坑

    坑的场景: 今天使用httpclient-4.5.3版本,发送如下报文: { "idNo": "7+6+0+2ce722a546b39463bd62817fe57f8&q ...

  5. 手把手教你整合 SpringMvc+Spring+MyBatis+Maven

    注:该教程是参考孙宇老师的<SpringMvc+Spring+Mybatis+Maven整合视频教程1>整理的,花了我六个多小时,边复习视频边调代码边写教程,保证该教程每一步都能正确执行, ...

  6. SQL Server 的索引结构实例

    目前SQL Server 的索引结构如下: 这个是聚集索引的存放形式: 非聚集索引的方式如下: 它们是以B+树的数据结构存放的. 相信大家都看过类似的图,但是没有直观的认识,下面举一个实际的例子来说明 ...

  7. chengdongyue的笔记

    ---------------------------------------- Linux 基础 --------------------------------1.Linux的诞生 1.unix两 ...

  8. ionic+cordova 学习开发App(一)

    一.项目所需环境 (一)jdk 1.jdk的安装,必须同时包含Java 和javac [一般安装包中都包含有,可以确定下] (二)node.js 和NPM 1.大多插件和辅助工具都运行在NPm平台上. ...

  9. Java获取未知类型对象的属性

    获取未知类型对象的属性通常有两种方式: 一是通过自定义注解的方式,通过获取被注解的属性从而获取属性的值,这种方式也是Spring参数注入的重要实现手段 二是通过反射获取属性的名称,通过属性名从而获取属 ...

  10. Oracle like '%...%' 优化

    Oracle like '%...%' 优化 1.尽量不要使用 like '%%' 2.对于 like '%' (不以 % 开头),Oracle可以应用 colunm上的index 3.对于 like ...