const和非const变量/对象/指针之间的赋值问题
变量赋值
const int a = 10;
int b = 10;
a = b;// error
b = a;// correct
变量在经过const关键字修饰以后就不能再被修改了,所以a=b是错误的。而b=a仅仅是将a变量中的内容复制一份给了变量b,所以赋值过后对副本b进行操作是不会对于a有什么影响的,这样行为是合法的。
对象赋值
struct A
{
int a;
};
const A a;
A b;
a = b;// error
b = a;// correct
对象之间的赋值和变量之间的赋值也是一样的,只不过对象中可能存在的数据更多一点,但是赋值的性质还是和变量赋值是一样的。
指针赋值
int n1, n2, n3;
const int* a = &n1;
int* b = &n2;
int* const c = &n2;
a = b;// correct
b = a;// error
b = c;// correct
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OECqWkBI-1628693667815)(C:\Users\张昊宇\AppData\Roaming\Typora\typora-user-images\1628693631603.png)]](https://i-blog.csdnimg.cn/blog_migrate/d42581aed1a809f84b241f17ad473442.png)
首先要明确a和c的区别,a中const修饰的是*a,所以a指针指向的内容是不可以被改变的,而c中const修饰的是c本身的指向,所以c的指向是不能被改变的。
a=b,相当于a指向b指向的空间,但是a的指向的内容是不可以被修改的,b的指向是可以修改的,所以这样a的指向不会对b指向的空间造成潜在威胁。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wWkFBF5F-1628693667817)(C:\Users\张昊宇\AppData\Roaming\Typora\typora-user-images\1628693641545.png)]](https://i-blog.csdnimg.cn/blog_migrate/c4bca83a5cda8b20cd0b683652a3866f.png)
b= a,相当于b指向a指向的空间,a的指向的内容是不可以被修改的,b的指向是可以修改的,这时候如果通过b就可以修改a指向的空间中这不允许被修改的内容,这样b指针的指向改变就会对a指向的空间造成潜在的威胁。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LcFtFY8B-1628693667817)(C:\Users\张昊宇\AppData\Roaming\Typora\typora-user-images\1628693648099.png)]](https://i-blog.csdnimg.cn/blog_migrate/0fed0b0789f400e69f7f138fa13e5baa.png)
b=c,相当于b指向c指向的空间,因为c的指向不可以被改变,但是空间的内容是可以被修改的,所以b并没有对c指向的空间造成潜在的威胁。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NVhL3zsV-1628693667819)(C:\Users\张昊宇\AppData\Roaming\Typora\typora-user-images\1628693654546.png)]](https://i-blog.csdnimg.cn/blog_migrate/28fa4bd42a83630086f042cb9a6bc60b.png)
本文详细探讨了const关键字在C++中如何影响变量、对象和指针的赋值行为。const修饰的变量或对象不可修改,导致赋值方向上的差异:const对象不能赋值给非const对象,但反之可以。对于指针,const修饰指针内容或指针本身会产生不同效果,影响赋值的合法性。
3846

被折叠的 条评论
为什么被折叠?



