const是c++中威力强大的助手,可被施加于任何作用域内的对象,函数参数,函数返回类型.成员函数自身。
一. const 作用于指针:
当const出现在*号左边时(const 写在类型之前或者之后,意思都一样),代表的是指针所指物是常量:int age = 11; const int * a = &11;这种情况下,a自身是可以改变的,即可以给a重新赋值,使a 指向其他的对象,但是*a是不能改变的:*a += 1; 错误,a指向的对象是常量,不能改变。
int day = 7; a = & day; 正确,可以重新改变a 的地址。
当const出现在*号右边时, 代表的是指针自身是常量指针,所以不能给指针重新赋值:
int age = 11;
int * const a = &11;
int day = 7; a = & day; 错误,a为const指针,不能改变它的地址。
* a += 1; 正确,a 所指的对象为non-const对象,可以改变其值。
当const 即出现在*号的左边又出现在右边时,代表的是此指针既是const指针,而且指向的对象时const对象:
int age = 11;
int * const a = &11;
int day = 7; a = & day; 错误,a为const指针,不能改变它的地址。
* a += 1; 错误,a 指向的对象时const对象,不能改变其值。
指向 const对象的指针和指向non-const对象的指针的赋值问题:
1.指向const对象的指针既可以接受const对象的地址,亦可以接受non-const对象的地址:
const int a = 2;
int b = 3;
const int * point = &a; 正确,此时既不能通过*point 来改变a 的值,也不能通过a来改变其值。
point = &b;正确,不能通过*point来改变a的值,但能通过b来改变其值
2.指向non-const 对象的指针只能接受non-const 对象的地址:
const int a = 2;
int b = 3;
int * point = &b;正确,此时对象的值既可以通过*point来改变,亦可以通过a来改变
point = &a;错误,假设能,那么由于指向non-const对象的指针可以修改对象的值与该对象是常量就形成矛盾。
二.const作用于迭代器:
迭代器与指针类似,分为迭代器自身为const迭代器,和迭代器所指向的东西是不能改变的。
三.const作用于常量,代表该常量是不能改变的。const作用于类,代表该类的成员变量是不能改变的!且const类对象.指针.引用,只能调用类的const成员函数,因为任何非const成员函数都有修改成员变量的企图。
四.const成员函数:
const作用于成员函数,代表该类的成员函数不能修改类中的任何变量,且在此const成员函数内不能调用该类的非const成员函数。
五.const作用于函数参数:
1.pass-by value to const: (无意义,形参为const,即副本不变)
2.pass-by point to const :指针所指向的对象是常量 (有意义)
3.pass-by reference to const (有意义)
2和3参数传递效果和函数按值传递的效果是一样的,只是2和3不产生副本!