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
首先要明确a和c的区别,a中const修饰的是*a,所以a指针指向的内容是不可以被改变的,而c中const修饰的是c本身的指向,所以c的指向是不能被改变的。
a=b,相当于a指向b指向的空间,但是a的指向的内容是不可以被修改的,b的指向是可以修改的,所以这样a的指向不会对b指向的空间造成潜在威胁。
b= a,相当于b指向a指向的空间,a的指向的内容是不可以被修改的,b的指向是可以修改的,这时候如果通过b就可以修改a指向的空间中这不允许被修改的内容,这样b指针的指向改变就会对a指向的空间造成潜在的威胁。
b=c,相当于b指向c指向的空间,因为c的指向不可以被改变,但是空间的内容是可以被修改的,所以b并没有对c指向的空间造成潜在的威胁。