1、const 修饰的变量不管是指针还是非指针,均需要在声明时初始化(类的const成员变量必须在构造函数初始化列表中初始化),并且不可第二次赋值。
2、const TYPE t_test <==>TYPE const t_test 均表示t_test为常量。
3、const TYPE * t_ptr<==>TYPE const *t_ptr 均表示t_ptr指针指向的内容不可变 。
4、TYPE* const t_ptr 表示 t_ptr指针本身不可变。
5、const TYPE *const t_ptr<==>TYPE const *const t_ptr 均表示t_ptr指针本身和指向的内容都不可变。
如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。[1]
6、const 修饰类的成员函数时,表示在函数体内不能修改成员变量的值,也不可调用会修改成员变量的其他成员函数,没有修改成员变量的值是可以调用的。const对象/对象指针/对象引用只可调用const函数,不可调用非const函数,哪怕这个函数没有修改成员变量。
类的const变量必须在构造函数初始化列表中初始化,有且只有static const变量才可以在类中(声明时)初始化,仅仅是static不行。const和static关键字的顺序无关紧要。
7、当const修饰引用时,可以用类似的规则去记忆,但是会有不同。比如,引用只存在其"指向”的内容的变化,而不存在其本身可不可变的问题,指针的话,存在地址+1单位。关于引用的很好的一篇很好的分析博文[2]。
你会发现如下的Visual Studio 2010测试代码很奇怪,请仔细分析。
#include <iostream>
using namespace std ;
int main( int argc , char **argv )
{
int i = 10 ;
const int& iRC = i ;
cout << i << " " << iRC << endl ; // 10 10
i++ ;
cout << i << " " << iRC << endl ; // 11 11,this is a knowledge point I may ignore.
//iRC++ ; // error,but i++ can cause iRC++
int j = 11 ;
int& const jRC = j ;
cout << j << " " << iRC << endl ; // 11 11
j++ ;
cout << j << " " << iRC << endl ; // 12 11
jRC++ ; // right
cout << j << " " << iRC << endl ; // 13 11
const char sz_char[] = { 'a' , 'b' } ;
//sz_char[0] = 'c' ; // error,the content that sz_char points to cann't be changed
//char *c_ptr = sz_char ; //error,sz_char is const char pointer
return 1;
}
运行结果:
下面这张图片大家可以无视,是本人下次编辑时的提示稿,和下面的链接引用,如果要深究const的种种使用情况,非一朝一夕能成也。
今天已经看了很多关于const的帖子了,这些需要休息下再看:常看常新,这么重要的知识点,不可能一次就全吃透,更需要平时多用。
http://stackoverflow.com/questions/5598703/c-const-usage-explanation
http://www.parashift.com/c++-faq-lite/const-correctness.html
http://www.parashift.com/c++-faq-lite/constptrptr-conversion.html
http://www.cprogramming.com/tutorial/const_correctness.html
http://blog.csdn.net/Eric_Jo/article/details/4138548
扩展博文:C语言各种奇葩声明的记忆规则
[2]An Insight to Reference in C++
相关博文:[1]http://blog.csdn.net/Eric_Jo/article/details/4138548
http://bbs.csdn.net/topics/310007610