const int *x 和 int * const x, const int& x和 int const &x的区别

一、const int&和int const&的区别

int const&表示此引用所代表的int类型变量无法使用此引用修改.
const int&表示此引用所代表的是const int类型变量,同样也无法用此引用修改.

两者的区别是:
int const&所代表的变量可以是int 和 const int .
const int&所代表的变量仅可以是 const int 

二、const int*和int* const的区别

关键问题点:const 属于修饰符 ,关键是看const 修饰的位置在哪里

1、const int *a
这里const 修饰的是int,而int定义的是一个整值
因此*a 所指向的对象 值 不能通过 *a 来修改,但是 可以重新给 a 来赋值,使其指向不同的对象
eg:
  const int *a = 0;
  const int b = 1;
  int c = 1;
  a = &b //ok! 额外:注意不能通过a 来修改 b值
  a = &c //ok! 额外:虽然c本身不是一个常量

  *a = 2 //error! 问题就在这里,不能修改通过 *a 所指向的对象值,最后赋值得对象是c,因此不能通过*a 来修改c值。

    首先const   修饰的是整个*a(注意,我写的是*a而不是a)。所以*a是常量,是不能被赋值的(虽然a所指的b是变量,不是常量)。
     其次,a前并没有用const 修饰,所以a是指针变量,能被赋值重新指向另一内存地址的。你可能会疑问:那我又如何用const 来修饰a呢?其实,你注意到int * const a中const 的位置就大概可以明白了。请记住,通过格式看语义。

2、int *const a  
这里const修饰的是 a ,a代表的是一个指针地址
因此不能赋给a其他的地址值,但可以修改a指向的值
这有点和cont int *a相反的意味,例子就不说了
3、至于int const *a 和 const int *a 的意义是相同的 他们两个的作用等价
补充:
4、const int * const a 
这个代表a所指向的对象的值以及它的地址本身都不能被改变
5.const int a = 10 和 int const a = 10有什么区别?
这应该没区别,指针的话有区别 

对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const。


最后总结两句:
     1).如果const 修饰在*pi前则不能改的是*pi而不是指pi。
     2).如果const 是直接写在pi前则pi不能改。


关于const的点滴补充:
1、const 对象的地址只能赋值给指向const 对象的指针
2、指向const 对象的指针可以 被赋 以 一个非const 对象的地址 
3、指向const 的指针常被用作函数的形式参数,保证被传递给函数的实际对象在函数得实际对象在函数中不会被修改
4、常量在定义后就不能被修改,所以它必须被初始化。未初始化的常量定义将导致编译错误(上面都是在说明const得问题,所以没有赋值,实际语句中要赋值的)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章