C++常量详解一(常量指针与常量引用的初始化)
1、常量
1.1、常量的初始化:
const对象一旦创建后其值就不能再改变,所以const对象必须初始化。这里我们要注意一点,像const int *p和const int &r都并不是const对象。因为const int *p只是表示不能通过p改变p所指的对象的值,p的值是可以变的,所以p可以不用初始化。至于r ,引用本身就不是对象,所以r也并不是const对象,r之所以一定初始化,是因为引用必须初始化。对于以上内容,你也可以理解为底层const 修饰的并不是const对象,还要注意像const int *const p1这种,这是一定要初始化的,这是const对象,因为它有一个顶层const。
1.1.1分清了const对象后,让我们先把目光聚集到const对象这里。
const对象可以分为大致三类:
const int m int *const p const int *const q
而这前两类都可以用来给非const对象或者const对象初始化,因为这前两类都是顶层const,初始化时的拷贝是不会对他们的自身值做出什么改变,即以下代码均正确。
//第一类 int m1=m;//正确 const int m2=m;//正确 //第二类 int *p1=p;//正确 int *const p2=p;//正确 const int *p3=p;//正确 const int *const p4=p;//正确
而第三类则需要我们注意一下,因为第三类还有一个底层const。
const int *const q
int *q1=q;//报错 int *const q2=q;//报错 const int *q3=q;//正确 const int *const q4=q;//正确
底层const有一个限制:当执行对象的拷贝操作时,拷入和拷出的对象必须具有相同的底层const。
我们可以这样理解:const int *const q如果可以拷贝初始化给q1、q2,那么意味着我们可以通过q1、q1来改变q所指的对象的值,那这样q的底层const还有什么意义呢?
以上,是说这三类可以给哪些对象初始化,现在我们看看哪些可以给这三类初始化
第一类const int m
//以下一些变量不初始化,我把重点落在类型。 int m1; const int m2; const int m=m1;//正确 const int m=m2;//正确
第二类int *const p
//以下一些变量不初始化,我把重点落在类型。 int *p1; int *const p2; const int *p3; const int *const p4; int *const p=p1;//正确 int *const p=p2;//正确 int *const p=p3;//错误 int *const p=p4;//错误
这里的报错同样因为底层const有一个限制:当执行对象的拷贝操作时,拷入和拷出的对象必须具有相同的底层const
第三类 const int *const q
//以下一些变量不初始化,我把重点落在类型。 int *q1; int *const q2; const int *q3; const int *const q4; const int *const q=q1;//正确 const int *const q=q2;//正确 const int *const q=q3;//正确 const int *const q=q4;//正确
1.1.2 现在让我们把目光转回非const对象的初始化
这里主要有两类:
//以下一些变量不初始化,我把重点落在类型。 const int *p; const int &r;
先考虑他们可以给哪些对象初始化
第一类 const int *p
//以下一些变量不初始化,我把重点落在类型。 int *p1=p;//报错 int *const p2=p;//报错 const int *p3=p;//正确 const int *const p4=p;//正确
此处同样由于低层const的限制
第二类 const int &r
//以下一些变量不初始化,我把重点落在类型。 int &r1=r;//错误 const int &r2=r;//正确
这里强调一下,引用不是对象,所以没有像 int *const &r或者const int *const &r这种形式
好,再考虑哪些可以给他们初始化
第一类 const int *p
//以下一些变量不初始化,我把重点落在类型。 int *p1; int *const p2; const int *p3; const int *const p4; const int *p=p1;//正确 const int *p=p2;//正确 const int *p=p3;//正确 const int *p=p4;//正确
因为const int *p意义在于表明不可以通过p改变它所指的对象的值,这个对象可以不是常量,只是p所指的对象对于p来说是常量,所以它所指的对象是否const 其实并没有关系。
第二类 const int &r
//以下一些变量不初始化,我把重点落在类型。 int &r1; const int &r2; const int &r=r1;//正确 const int &r=r2;//正确
这里const同样是指不能通过r改变它所引用的对象,所以它所引用的对象本身是不是const无关紧要。
纵观以上的错误,都是试图把底层const拷贝初始化给没有底层const的对象。
以上就是关于涉及到常量的指针和引用的初始化的解释了。
- silverlight2中的定时器,以及如何动态改变控件的坐标
- 定时备份windows机器上的文件到linux服务器上的操作梳理(rsync)
- jQuery1.3以上版本"@"的问题
- 龚宏绩:三七互娱游戏上云的现状与未来
- Android 程序打包及签名
- 韩伟:解谜腾讯游戏海量服务架构
- Message和handler传递对象
- MVC RC2中关于HtmlHelper给DropDownList设置初始选中值的问题
- 结构struct(值类型)在实际应用要注意的二点:
- 王璋:腾讯云为游戏行业提供解决方案
- 利用Reflector把"闭包"看清楚
- CSS伪类的三种写法
- 吴晓斌:"吃鸡"游戏全球多地部署架构分析
- silverlight + wcf(json格式) + sqlserver存储过程分页
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 走近STL - Vector,再次见面
- 【线性回归】标准方程法
- 133: error: in C++98 XXX must be initialized by constructor, not by '{...}'
- spring之如何将验证错误信息显示在相应界面
- 【python-leetcode329-深度优先搜索】矩阵中的最长递增路径
- 带权树 -- 哈夫曼树,与它的那张哈夫曼编码表
- 【python-动态规划】0-1背包问题
- python之列表推导和生成器表达式
- 二叉树的前中后序遍历
- 【tensorflow2.0】处理结构化数据-titanic生存预测
- 【pandas】pandas中的常见函数
- 走进STL - 哈希表,散装称重么
- 第八届蓝桥杯省赛javaB组题目解析
- 拥抱STL - 类/结构体元素查询与排序
- 【tensorflow2.0】处理图片数据-cifar2分类