1、const修饰一般变量时:
使用const修饰的变量为常量,常量只有在声明时能被定义,且在此之后无法被修改。对于被修饰被const的类成员变量,只能在构造函数中以附加初始化列表的形式,也就是class():xxx()yyy(){}来进行初始化。
2、const修饰指针时:
const int *a等价于int const *a,表示a是一个指向常量的指针,作用就是*a无法作为作值,至于指向的int到底是不是const?并不重要。
一个阅读指针的trick:从右往左读,const int *a:a->point to->int const。这里int const和const int是一样的,const无所谓前还是后。
而int * const a则表示a是一个指向int的常量指针,意思是,这个指针只能指向那个int了,所以这条声明在声明的同时也要对所指向的目标进行定义。当然,这里跟上面不一样的时,它只能指向非const的int,要想指向const int要用:const int* const a。
3、const int foo():
修饰函数,则返回值是一个const int,这个返回值就不能再被改了。同理const int*、int const *和int* const,前两者指向的变量不能被修改,但可以指向新的变量,后者只能指向已经指向的变量,但可以改变被指向变量的值。
4、只在class中出现的class::int foo() const:
表示foo是class类中的一个常成员函数,常成员函数的特点是其不能修改成员变量的值,这包含2层含义:1、不能直接修改;2、不能调用其它函数简介修改。第一点是容易保证的,只要检查函数本身即可,第二点难以保证,因此要求常成员函数只能调用常成员函数,不能调用包含风险的非常成员函数。
5、int foo(const int &a):
意思是,甭管在外面a是啥样,传进来以后就得是const的了,至少在这个函数里面a是不能被修改的。
6、怎么把一个const转换为非const呢?用const_cast<new_tpye>()。