const与非const类型赋值问题

const与非const类型赋值问题

以前总有个问题想不通,就是为什么从const char到char的赋值就会出错,而const int到int的赋值就没问题呢?呵呵,不知道有没有其他新手和我有相同的疑问呢?还算我运气好,今天不知道怎么会触发了灵感,终于把这个小白问题想通了。答案就是:

从const int到int的赋值操作,是一种对象的拷贝,赋值后我们在对象的副本上操作当然不会有问题。 从const char到char的赋值操作,虽然也是一种对象的拷贝,不过我们拷贝的只是指针对象,而指针指向的对象却是同一份,这个对象在赋值前后的类型发生了变化,编译器自然就会报错。 另外从char* const到char*的赋值仅仅是指针对象的拷贝,而指针指向对象的类型相同,编译器也不会报错。

const与非const之间,相互赋值时,如果使用不当,可能造成一些问题。

非指针类型

  • 非指针类型
const int c_A = 10;
int b = 20;

b = c_A ; // 正确
c_A = b; // Error!
  • 原因:
    1:关于这个问题,网上有说”非const变量赋给const变量,是非法的“。请不要陷入这种容易混乱的逻辑。
    2:上述情况,比较正确的解释。const int 在初始化之后,是不能再改变的。且const int 必须在声明时就赋值。
// Error
const int c_A;
c_A = 10;

指针类型

const int* c_PtrA  =  new int(10);
int * ptrB= new int(10);

c_PtrA = ptrB; // 没问题
ptrB = c_PtrA; // 编译报错 不能从 const int* 转换程 int*

// 下面这种情况不会报错,但可能造成程序崩溃
ptrB = (int*)c_PtrA;
// ....
*ptrB = 20; // 此处修改了b和a共同指向的地址的内容,程序崩溃

  • 原因:
    1.const int * 表示,指向常量int 类型的指针,即指向的这块内存的内容,不可以修改。(但指针本身可以修改)。
    2.int * 表示,指向非常量int类型的指针,指针这块内存的内容可修改,指针本身可修改。
    3.const int* 已经限制此地址内容,不可修改。这时,却让 int * 指针指向这块地址,而使用 int * 指针,表示此地址内容可修改。那么到底可不可以改?
    4.接上,因此逻辑冲突,编译器报错。
// 正确
const int * c_A;
// ...
c_A = someAddress;

1.因此,对于非指针类型的const,可以理解为使用"const”,就是常量了。什么是常量?10,20,“linduo"等都是常量。 int a、char s等都是变量。
2.对于指针类型,当然有常量指针和指针常量的区别。可以理解为,使用"const”,是用来限制,指针本身或指针指向内容,可不可以修改。

猜你喜欢

转载自blog.csdn.net/baidu_38410526/article/details/102679685