const是constant的缩写,意思是“恒定不变”
1. 可以定义const常量
学名叫限定符声明变量
const int i=4;
int j=5;
i=j; // l-value specifies const object 错的
j=1; // 对的
以上代码中,一共定义两个变量,其中变量i的定义被const限定符修饰,那么被const限定符修饰说明了什么呢?这里首先要说一下C/C++中 左值、右值的问题。
左值:可放在赋值符号左边的变量,即具有对应的用户可以访问的存储单元,并且可以由用户去改变其值的量。
左值表示存储在计算机内存的对象,而不是常量或者是就算结果。或者说左值代表的是一个内存的地址值,并且通过这个内存地址就可以对指定地址的内存进行相应的读、写操作,这里最关注的对其写的操作。左值的英文表示是:L-Value 其中的L代表的是Location表示可寻址,并不是指的Left
右值:可以放在赋值符号右边的变量,是计算机能读取其值。
右值指的是引用了一个存储在某个内存地址里的数据,简言之,左值相当于地址值,右值相当于数据值。右值的英文表示是:R-Value其中的R代表的是 Read表示可读。
从上面的说明中,我们就可以看出,原本没有const限定符修饰的变量作为左值时是可以被访问的、其地址所在内存的值是可以被改写的,但是加上限定符const以后的变量将不再具有成为左值的权利了,因为此时这个变量经过const的修饰以后已经不具备作为左值的条件了,所以上面代码中的第三行会报错,而第四行确不会报错。回头想想为什么我们要加上一个const限定符来修饰一个变量呢?对于上面这种情况只有一种原因就是我们所定义的i变量的值之后,不希望被改变。既然经过const修饰的变量对应的内存单元不能被访问(更改),那么在最初定义的时候就一定要给这个经过const的变量附上初值,否则,定义它有什么用呢,不给这个变量付初值、这个变量也永远不能成为左值,也就意味着我们定义了一个永远也没有具体指的变量,又有什么意义呢,所以在定义const修饰的变量时,一定要赋初值,否则就没什么意义了吧!
一下这段代码说明了什么?
const int i=110;
int *p=(int*)&i;
p=100;
cout<<i<<endl;
cout<<*p<<endl;
运行之后,会报错error C2440: '=' : cannot convert from 'const int' to 'int *'指的就是第三行,从而我们可以看出100隐形的就是const int型的一个量
在具体深入一下,不论是左值、右值、const限定符都是由语言设计者设计的,那么他是根据什么来规定这些的呢?C++语言的创始者是Bjarne Strousstrup,但是他并不是计算机语言的第一个创始者,C++语言只不过是众多语言中的一种,还有很多在其之前就创立的语言例如:C、汇编、Pascal、Delphi。但是语言使用最终是要建立在硬件上的,不是么?我没看见谁的代码写完之后在天上飞,所以设计语言的大牛们都深明这一点,即搜设计的语言最终是要通过硬件来实现其设计的相应功能的,谈到此,必须得了解一下硬件的知识了。
学习和使用过汇编语言的人们想必一定很熟悉计算机组成原理,否则学了也是稀里糊涂的过过就那么回事儿了。为什么呢?
汇编语言是直接操作寄存器和存储器的一门语言,它仅次于0、1二进制语言。
说到0、1二进制语言就不得不说说硬件是怎么通信的了,学过物理的都知道硬件是通过高、低电位来工作的,比如说家用电电灯的开关,在逻辑上,我们可以通过0、1来表示他们的状态,计算机内的硬件设计是由N个像家用电灯的开关组合而成的,这里的比喻有可能不是太恰当,但在此重在说明逻辑上的意思。以前我也是不解为什么一个个的开关可以创造出这么奇迹的东西来,后来在询问老师的过程中,老师给我举了一个例子:一个人能干什么?一百个人能干什么?明白了么?以前很是纠结计算机是怎么设计出来的,但是现在谈的是计算机语言的应用,so点到为止吧!因为在设计计算机电路时要涉及到很多的电学、物理学以及数学上的知识,在此说这些重在说明先别纠结这些知识,先了解一些,并不是说它不重要,而是在了解其原理是需要许多其他专业知识的辅助,如果想了解就先学学电子电路、模拟电路、微机原理。所以把硬件的设计抽象化,我们来看看抽象化后的计算机主要器件具有什么功能。算了 越说越多 直接看看计算机组成原理吧同时和汇编双管齐下,方可恰到好处
2.可以修饰函数的参数(表明它是一个输入的参数,在函数的内部是不能被改变其值的)
void Func(const A &a)
{
}
3.可以修饰函数的返回值(使其返回值不为左值)
const A Func(const A &a)
{
}
4. 可以修饰函数的定义体(则表明是一个常函数,不能修改类的成员变量)
void Func(const A &a)const
{
}