const,c/c++中非常常用的关键字。
首先我们看看const有那些修饰方法。
最前面我们来看一个问题。
可能有的人不知道,这里的这个"123"是存储在常量区的,不容许修改的。
也就是说它是个const类型的。
标准的写法应该是
至于为什么编译器容许上面的那个不标准的写法,可能是因为兼容性的问题吧。
切入正题。
上面的很容易理解。但带上指针有些同学可能就要昏了。
(1)和(2)的效果是一样的,意思是 p 是可变的,但是 p 指向的值是不可变的。
(3)就刚好相反,p 是不可变的,只能指向一个地方,但是 p 指向的值是可变的。
(4)p不可变,*p 也不可变。
我们举个例子看看。
------------------------------
------------------------------
有的时候我们会使用tpyedef。
-------------------------------
有时候我们会使用括号
-----------------------------------------------------------
在c中 被const修饰的变量并不是正真意义上的常量,而是只读的变量,这和常量还有不少的差距的。
也就是说在内存中开辟一个只读的空间存贮这个变量,如何保证这个空间只读是通过编译器实现的,
当我们能骗过编译器的时候,我们就能就能修改const常量。
在c代码中写:
这段代码是不能通过编译的,如果真的想这么干只能通过宏来实现了。
大家都知道宏替换的一些弊端,比如:NUM没有类型,从此NUM这个名字再也没有别的用途。
-------------------------------------------------------------
而c++中的const就先进的多了。他是在编译的时候就已经确定了的值。
同样的代码在C++中就一点问题都没有了。
而且我们还可以通过强制转换去掉其const属性。
但是我们要明白的是c++中使用const_cast的目的不是要我们去修改一个const量(虽然我们可以用各种方法做到),
而是让我们可以用一个 指向非const的指针(或引用) 去 指向一个const的变量,通常在函数调用时使用。
下面我们也尝试一下修改const量。
很简单:
OK了。
有的同学试验了,可能出问题了。
a打印出来都是4啊,没变啊。
其实是变了。
如果我们打印 *p,*q 发现其值是9。
我们打印p,q,&a地址也是一样的。
这就更奇怪了,同一个地址怎么可能有2个值。
我来告诉大家为什么
我们的编译器是很强大的,他会对代码进行一些优化,
当我们定义变量a之后,再使用a的时候,没有从a的地址去取值,而是直接使用了4 。
所以打印的还是4。
有人会觉得我在耍他,不信我们使用下面的代码
此时下面打印的就是9了。
所以啊,我们不要随便去改const量,常常会有一些出乎我们意料的结果。
既然定义了const心里就想着他是常量了。
----------------------------------------------------------
const还可以用来修饰方法,不过const就不是像static那样放在函数的前面了,
因为放在前面的const已经有意义了,是指函数的返回值是const的。这样只能放在函数的最后了。
例如:
有什么作用呢。他的意思就是这个方法不能修改类成员变量的值。
例如
如果我们定义一个const的human对象。那么我们使用这个const的对象的方法时只能使用被const修饰的
方法。
有的同学有疑问了,如果类中有的值是需要在const时改变的怎么办。
C++此时又引入了一个很好的关键字mutable
下面谈一下一点的其他问题:
见过别人写这样的代码:
这样的代码看似没有问题,也可以正常运行,但是存在巨大的隐患,会给不法分子可乘之机。
char *getName()这个方法。这个方法将我们的private变量暴露给了别人。
我们就可以通过调用这个接口获得这个地址修改其中的值。
我们可以将其改写为
这样
不过我们最好改写为
const还是十分重要的啊。
终于写完了,:-)。一定要认真阅读啊。
不足及错误欢迎指正。const还有其他有趣的一些用法也欢迎分享啊。^_^。
不容易啊,给点掌声吧。