首先要说明的是,const是限定符,被他限定的的东西都被赋予了不能改变的意义,也就是常量,这也就意味着,const这个限定符可以和变量,指针,引用,函数等等一起使用。
还要说明的是,看完这篇博客,不能是你立刻的踏上人生巅峰,赢取白富美,变成高富帅。要想精通const的用法,还是看书——c++ primer和多多的练习。
上面也说了,const可以和那么多的东西发生关系,那么我们一个一个的来讲解。
1.const和变量
在c++中,声明一个变量:数据类型 变量名;
一旦和const发生关系,这个变量就变成了一个常量,也就是他的值不能在改变了。
例如:const int i=0; i=9;//这里就会报错,因为视图改变i的值。
还要注意的是 const对象必须初始化!!!
cosnt对象只能执行操作,不能改变const限定的值!!
2.const 和引用
2.1 啥是引用?引用就是给变量起来一个绰号或者别名。
例如:int i=0; int &j=i;//定义了一个引用j,j是i的引用。
但是要注意,引用必须要初始化!
2.2对常量的引用。
首先,我们定义一个常量 const int i=9;
然后我们定义一个对常量的引用:const int &j=i;
j++;//错误,因为这是改变常量。
int &j=i;//错误,因为,常量i被一个非常量引用。
2.2常量引用
这个称呼可以有,但是严格来说,这是错的。因为,引用本身不是一个对象,因此,就不会存在常量的引用。我们没有办法放引用恒等不变。引用的对象是常量还是非常量可以决定其所参加的操作,但是不会影响到引用和对象本身。
3.指针和const
3.1指向常量的指针
const int i=0;
const int *j=&i;//这就是指向常量的指针。
这个怎么理解,在看上面的表达式中,我们采取从右向左的看。首先,找到变量j,这个j是一个指针,什么样的指针呢?指向一个int 常量的指针。
我们要注意,指向常量的指针可以用常量来初始化,也可以用非常量初始化。例如:
int i=9;
const int *j=&i;
注意,指针的类型和指向的类型应该是相同的!!
3.2常量指针
const int i=9;
int *const j=&i;
在这里我们和上面的是一样的。首先,从变量j开始,前面有const修饰,他是一个常量,接着往左看,他的类型是一个指向整形的指针。
这里有一个更深的含义,将const放在*的后面,表示:不变的应该是这个指针j,而不是指向的对象。
还有,在这里,必须使用常量来初始化。
3.4顶层const
顶层const就是常量指针,底层const就是指向常量的指针。
4.const和函数
4.1 成员函数
在类的设计中,类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变。,也就是这个函数只能读入数据,不能改变数据。
在设计类时,一个原则就是对于不改变数据成员的成员函数都要在后面加const,而对于改变数据成员的成员函数就不加const。
所以const关键字对成员函数的行为作了更加明确的限定:
有 const 修饰的成员函数(指 const 放在函数参数表的后面,而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员;没有 const 修饰的成员函数,对数据成员则是可读可写的。
4.2 cosnt形参
1.如果顶层const是形参时,传给他常量对象或者非常量对象都可以。
2.在函数重载的时候,如果一个函数的形参时顶层const,另一个函数的形参不是顶层const,在重载的时候,他们两个函数是同一个函数,不会加以区别。
最后要说的,const的熟练使用,会对编程有很大帮助,能够让你的代码更加的完美。