网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.

【C++】5种 const 使用 区别


本文出自【悠然品鉴】转载请注明出处:http://www.youranshare.com/blog/sid/21.html

本文观点纯属小编个人理解,如有错误,请指出.


大家都知道 const 修饰的变量是只读属性,那么下面5种 const 使用方法你能够分清吗?

->第1个================

  int n = 50;
  int const m = n;

->第2个================

   int n = 50;
   int const *p = &n;

->第3个================

   int n = 50;
   const int *p = &n;

->第4个=================

  int n = 50;
  int* const p = &n;

->第5个=================

  int n = 50;
  const int* const p = &n;


********************************************************

如果你能很好的区分它们的话,那你就不用再往下看了 ^v^;

 --》对于 第1个,“int const m = n;”

     我想大多数童鞋都应该很了解吧,

     m 变量类型是 const ,所以m所存储的内容不可被修改,

     即是 m 被【赋值】为50后不可以再次修改(由于m是const类型,在定义时 必须要进行 初始化操作!!!)


--》第2个,“int const *p = &n;”

    p是一个 int 指针,const 修饰的是 “*p”这个整体,

    此时 如果对 *p 所存的数据重新赋值则会出错,

    例如: 

           *p = 10;//错误原因:error C2166: l-value specifies const object.

    但是 如果对 n 进行 n = 10; 重新赋值 却不会 报错。

    这是因为 虽然 n 与 *p 所表示的是同一个 内存单元,

    但是 n 与*p的 flag标志寄存器 内容不同,n 变量允许读写操作,而 *p变量

    只有 读取 权限。所以导致了 n与 *p 虽然表示的是同一个内存单元,但是他们却拥有不同的操作权限。


--》第3个,“const int *p = &n;”

    同样 p 依然是一个指针,但是这时 const 的位置不同,

    毋庸置疑 const 修饰的肯定是 它右侧的内容,

    所以,此时 const 仍然修饰的是 *p;

    同2, 如果对 *p 所存的数据重新赋值则会出错,

    例如: *p = 10;//错误原因:error C2166: l-value specifies const object.


--》第4个,“int* const p = &n;”

    不同于2 和 3,const 修饰关键 是 p,

    即是说 p指针是 const 类型,p 不可以被 重新初始化;

    例如 执行:

        n = 11;//正确
        *p = 10;//正确
        p++;//错误   原因:error C2166: l-value specifies const object.

--》第5个,“const int* const p = &n;”

    不同于前几个,这里出现了 两个 const,

    但是观察 const 所修饰的关键位置不难 理解:

    右边的 const 所修饰的 是p,

    左边的 const 所修饰的 是*p,

    即是说 p 和 *p 均不能 被修改,

    例如执行下列操作:

          n++;//正确
          p++;//错误  原因:error C2166: l-value specifies const object.
          *p++;//错误  原因:error C2166: l-value specifies const object.


************************************************************************************************

总的来说:

     要想分清 const 所修饰的是哪个变量,

     仅需看 const 右边 有哪些变量,右边有关键字的话,就去掉关键字不考虑,

****例如:**************

        int const *p;//右边是 *p 即是说 const 修饰 *p;
        int const p;//右边是 p 即是说  const  修饰 p;
        const  int *p;//不考虑 关键字 int,即是说 const 修饰 *p;
        const int* const p;//逐个进行分析可以看出 左边 const 修饰 *p,右边 修饰 p;

**********************

好吧,教程 就到此 结束~~~ 


  • 标签:
  • C++
  • const
网站已经改版为Wordpress版本,这里是旧版本的快照,请不要在页面中留言.