c++中带有const ,&(引用)的常见类型的错误转换
来源:互联网 发布:python static method 编辑:程序博客网 时间:2024/06/04 20:38
首先,编译器为什么会报错?????
1:编译器会一直检测代码是否有更改st常量的可能,如果存在这样的可能,编译器就会报错。
///编译器要保证不能直接或间接的去修改常量内存
2:怎样看有没有错误转换呢?????
(1)对于简单代码:看有没有把一个常量的地址或者引用泄露给普通的指针或者引用变量
(2)对于复杂代码:找代表同一块内存的两个表达式,看是否把常量的地址试图放在一个普通指针里面
----->其实总的来说错误就是:把普通指针修改成存放常量地址的指针。
几种类型转换的公式*******(以整型为例)
const int * -->int *:类型转换错误。《1》
int *-->const int *:类型转化正确。《2》
const int ** -->int **:类型转换错误。《3》
int **-->const int **:类型转换错误。《4》/////后面我们会一一说明
************接下来我们先应该了解一下在c++中,const 位于*的左边和右边到底有什们区别呢?????
我们可以从运行的结果可以看出,当const 位于类型的*的左侧,指针类型中const是有参与的。
当const位于*的右侧时,const是不参与指针的类型的,此时int *const 就等价于int *,属于同一个类型。
******接下来我们看一看一些容易出错的例子
////这个是否正确呢???我们用上面的公式来分析一下
p的类型为int **(p是int *,&p则为int **)
而q的类型应该是int **(const位于*的右边,不参与类型)
所以此代码是将int **赋给int **(正确)
*****我们再来看一些例子
///////我们再来分析一下
首先&p的类型为int **,而q的类型为int *const*(以上有说明)
我们把两个指针的类型的前半部分int *看成一个整体(T表示)
则p的类型为T*,q的类型为Tconst*
所以此代码是将*转换成const *(正确)参见《2》
*****我们再来看一些例子
//////我们可以看出图中有划红线的部分,当然编译不能通过
这个同样我们可以看出p所对应的*q;*p对应的是**q;
我们选择p <--->*q进行分析
p的类型为const int *,而*q 所对应的 int* ,(参见《1》,错误)
所以肯定会出错,所以我们必须将*q改成const int *,当然可以这样改:
/////看,这样就不会出错
*****我们再来看一些例子
/////结果是报错了,图中const int * &q = p中,它就相当与const int **q = &p,(&代表的是引用,不等于取地址符)
&p的类型为int **,q的类型为const int **(参见《4》,错误)
*****我们再来看一些例子
//////当然,这个仍然存在错误,&p的类型为int *const*(&p就要给前面加*----->int *const *p),q的类型为int **,
我们把int *看成一个整体(T表示)
则代码的意思是将Tconst *转换成T*(参见《1》,错误),将const 去掉就可以了。
*****我们再来看一些例子
//////这个是正确的,那我们来分析一下,
int *const &q = p可以写成int *const *q = &p;&p的类型为int *const *,而q的类型为int *const *,所以正确。
************************************************
以上就是一些常见的例子,觉得很实用,总结一下就是上面的几个公式,主要看赋值号两边的类型是否要求,另外,如果是二级以上的指针,跟二级指针遵守规则一致。
- c++中带有const ,&(引用)的常见类型的错误转换
- C中常见的类型转换
- C语言中const 的常见用法
- C++(7):带有const的ref和pointer
- C:带有const修饰的指针解读
- C:带有const修饰的指针解读
- C++:带有const修饰的指针解读
- Java中引用类型变量的转换
- 引用类型的转换
- java中常见类型的转换
- Java中常见的类型转换
- ASP运行中常见的错误类型
- 关于工作中常见的类型错误
- 常见的类型转换
- java基础编程中常见的错误(基本类型)
- C++中const修饰二级指针(从类型‘int**’到类型‘const int**’的转换无效)
- C++中const修饰二级指针(从类型‘int**’到类型‘const int**’的转换无效)
- TFS安装:base_packet.cpp:246: 错误:从类型‘const char*’到类型‘pthread_t’的转换无效
- 使用谷歌(Google)TTS服务 – Java版开源gTTS及Python gTTS
- axios 详细使用方法 及跨域请求的处理
- 计蒜客 Query on a string 线段树
- 【干货】wordpress函数实现屏蔽s.w.org提升网站速度
- 如何让多行文字与图片垂直居中
- c++中带有const ,&(引用)的常见类型的错误转换
- eclipse项目转android studio问题解决记录
- solr6.0学习之环境搭建-windows
- 珍珠BEAD -- 图
- Matlab函数padarray小结
- 如何设置线程调度的优先级
- vue支持jsx
- 请求测试——Fiddler2工具(可以测试POST和Get)
- 利用IOC—— Castle进行对象映射,以及结合Nhibernate访问数据库