const in C/C++
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++的更多相关文章
- 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 ...
- const,static,extern 简介
const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...
- C++中的const
一,C++中const的基本知识 1.C++中const的基本概念 1.const是定义常量的关键字,表示只读,不可以修改. 2.const在定义常量的时候必须要初始化,否则报错,因为常量无法修改,只 ...
- const extern static 终极指南
const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ...
- const let,console.log('a',a)跟console.log('a'+a)的区别
const 创建一个只读的常量 let块级作用域 const let重复赋值都会报错 console.log('a',a) a console.log('a'+a) a2 逗号的值会有空格:用加号的值 ...
- es6之let和const
在javascript中,我们都知道使用var来声明变量.javascript是函数级作用域,函数内可以访问函数外的变量,函数外不能访问函数内的变量. 函数级作用域会导致一些问题就是某些代码块内的变量 ...
- construction const parameter问题 构造函数const引用参数问题
工程在window下编译没有任何问题, 但是在linux(CentOS6)下编译就老是报错 C++ 编译器已升级到最新版 6.1.0 错误如下: In file included /bits/stl_ ...
- Error:const char* 类型的实参和LPCWSTR类型的形参不兼容的解决方法。
在C++的Windows 应用程序中经常碰到这种情况. 解决方法: 加入如下转换函数: LPCWSTR stringToLPCWSTR(std::string orig) { size_t origs ...
- C#基础知识七之const和readonly关键字
前言 不知道大家对const和readonly关键字两者的区别了解多少,如果你也不是很清楚的话,那就一起来探讨吧!探讨之前我们先来了解静态常量和动态常量. 静态常量 所谓静态常量就是在编译期间会对变量 ...
- const 与 readonly知多少
原文地址: http://www.cnblogs.com/royenhome/archive/2010/05/22/1741592.html 尽管你写了很多年的C#的代码,但是可能当别人问到你cons ...
随机推荐
- 8条规则图解JavaScript原型链继承原理
原形链是JS难点之一,而且很多书都喜欢用一大堆的文字解释给你听什么什么是原型链,就算有图配上讲解,有的图也是点到为止,很难让人不产生疑惑. 我们先来看一段程序,友情提示sublimeText看更爽: ...
- Linux安装keepalived
1.下载安装ipvs安装包,进行解压 http://www.keepalived.org/software/ 2.创建安装路径连接 安装环境: yum -y install openssl-devel ...
- Sql索引
1.为什么要给表加上主键?建表的时候都会为表加上主键, 在某些关系数据库中, 如果建表时不指定主键,数据库会拒绝建表的语句执行. 一个没加主键的表,并不能被称之为「表」.一个没加主键的表,它的数据无序 ...
- 【转】正向代理vs反向代理
正向代理 正向代理:是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将 ...
- 新男人八题---AStringGame
终于完成进度男人1/8,为了这题学了sam= = 题意先有一个串,n个子串,两个人轮流每次在子串上加字符,要求加完后还是原串的子串,最后不能加的就是输者,求赢的人 解法:sam之后在构造的状态图上跑s ...
- js中常用的字符串方法
1,基础方法 charAt();返回该位置的字符,类似数组下标: substring();返回选中的字符,两个参数是下标. slice();参数是是一个正数,返回该数之后的剩余字符串:参数是负数,返回 ...
- springboo 添加logback日志
springboot默认引入logback相关的jar包 1.在 Application.properties里添加 logging.config=classpath:logback-spring.x ...
- HTML5页面,用JS 禁止弹出手机键盘
用户点击input的时候: 会默认调出手机软键盘: 场景:文本框获取焦点时,需要禁止手机弹出自带的输入键盘: 解决方案1: 用一个p/div等标签显示内容:然后放一个隐藏的input: (可能的场景: ...
- C#中Abstract和Virtua笔记,知识
在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Virtual方法(虚方法) virtual ...
- hdu2732
题解: 和上一题差不多 然后注意格式 代码: #include<cstdio> #include<cmath> #include<algorithm> #inclu ...