The const of C/C++

来源:互联网 发布:淘宝文艺礼物店铺 编辑:程序博客网 时间:2024/05/16 08:32

/**************************************************************************************************************************************

****红字部分为本文最简练的主要内容,根据个人理解,应该是可以很好的理清 const 的基本用法*********************************

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

****/

变量的定义包括一个基本数据类型(base type)和一组声明符;在一条声明语句中,从右向左阅读有助于弄清楚它的真正含义【1】。

基础部分:

关于引用和指针的const形式,我们依然可以按照上面的方法来解释:

1. 引用。

定义一个const的引用,即常量引用,就是对一个常量的引用,既然是常量,就不能通过这个引用改变它的值。如const int &r = 4; const int &r = a。我们来从右向左分析,首先,r是一个引用,由const说明它是一个对常量的引用,所以,不能通过r来修改这个常量的值。虽然引用的是一个变量,但const限定它为一种常量形式的引用,从r的角度来说a是一个常量,从a自身来说,它仍然是变量。

2. 指针。

定义一个const的指针,就是指向一个常量。我们不能通过这个指针来改变这个常量的值。如const int *p = &a。从右向左分析,首先,p是一个指针,const限定它是一个指向常量的指针,我们不能通过p来改变常量的值。从p的角度,它是指向一个常量的,而变量a自身,仍是一个变量。

另外,引用和指针,它们都是被用来处理另外一个对象的,除了类型要一致外,我们当然可以额外加一些操作上的限制。这const就是一种限制,使得引用和指针认为他们所引用和指向的是一种他们的特性所认为的那样的对象,而对象本身是什么样子,可能是不完全一样的。


扩展总结:

const int 和 int const是一样的,没有区别。const int * 和int  *const有区别,前者是底层const,后者是顶层const。修饰访问自身的方式为顶层,修饰通过自己访问另外的对象的方式为底层。

(1) const int a = 3; int const a = 3; 

(2) const int &r = a; int &const r = a;

(3) const int *p = &a; int *const p = &a;  前者为底层const, 后者为顶层const.

这三种情况,主要看有没有*、&修饰符,他们表示了符号访问对象的方式。(1)中,a标识一个对象,a以常量的方式来使用它所访问对象,就是自己。(2)中,r不是一个对象,它在定义时就要被初始化,且以后不能改变,所以int &const 和 int & 是一样的。这样,前者表示r以常量的方式来使用它所访问的对象。(3)中,p是一个对象,它以*p的方式来访问它所访问的对象,const int *表明它以常量的方式访问它所指向的对象;而int *const 表明它访问自己的方式是一个常量。

总结一下,三种方式,得到三种不同的结果,(1)中a只访问对象自己,(2)中r本身不是对象,只访问另外一个对象,且在初始化时设定访问的对象,(3)中p自己是对象,p访问自己,*p访问它所指向的对象。const直接在标识符前面还是隔着*或&,分别表示访问自身对象的情况和访问别的对象的方式。

***我们可以将指针作为一个标准规范的定义方式,自身是一个对象,而且可以指向访问另一个对象,有 const int *(或int const *) 和 int *const 的明显区别,分为底层和顶层const。而a只访问自己,所以只有顶层;引用r,自身不是对象,只访问别的对象,所以只有底层。


参考文献:

【1】Stanley B. Lippman, Josee Lajoie, BarBara E. Moo.  C++ Primer, 第五版.电子工业出版社,2013.

0 0
原创粉丝点击