最近也是要考c++了。。。所以把和const有关内容进行一个总结。。。
参考了这篇博文许多http://blog.csdn.net/mysunshinetbg/article/details/48346195
明白了许多,也在这之中添加了const限制函数参数以及常量成员函数两个很简单的内容。。。
1.const与常量
与变量不同,有const修饰的量是常量,常量的值不可改变。
-常量一经定义就不能修改
const int i=5; //定义常量i
i = 10; //错误,修改常量
i++; //错误,修改常量
-const常量必须在定义时初始化
const int n; //错误,常量n未被初始化
-在常量定义语句中可以出现表达式
int i, k = 9;
const int i1 = 10 + k + 6;
const int i2 = j + 10;
2.const与指针
-指向常量的指针
指针所指的对象是常量,指针本身是变量
const int *p; //等价定义为 int const *p
int i = 1;
int j = 2;
p = &i;
p既然指向常量,但是在定义的时候却并没有初始化,而且指向的i是一个变量。
这是因为常量指针自认为指向的对象是常量。
常量指针既可以指向常量,也可以指向变量,常量指针的真正含义在于不能通过p来改变所指向对象的值,并不代表不能通过其他途径来改变对象的值。如:
const int *p; //等价定义为 int const *p
int i = 1;
int j = 2;
p = &i;
int *r = &i;
*r = 9; //正确
*p = 9; //错误
在const int *p;
中,指针p本身是一个变量,它可以指向不同的字符串对象,但它指向的对象是一个常量,即*p是一个常量。因此可以修改p中内容,但不能修改 *pc中内容。
const int *p; //等价定义为 int const *p
int i = 1;
int j = 2;
p = &i;
p = &j;
-指针常量
指针p中存放的地址不可改变,p只能初始化,不能改变所指向对象
int i = 1;
int j = 2;
int * const p = &i;
*p = 2; //正确
p = &j; //错误
- 指向常量的常量指针
指针是常量,指针所指对象也是常量,上述指针常量和常量指针拥有的修改方法全部没有了。比如:
int i = 1;
int j = 2;
const int * const p = &i;
*p = 2; //错误
p = &j; //错误
3.const 与函数
用const限制函数的参数能够保证函数不对参数做任何修改,如:
int f(int i1, const int i2)
{
i1++;
i2++;
return i1+i2;
}
4.const与引用
和const指针一样,const引用可以与常量绑定,也可以与变量绑定,只是不能通过这个const引用来改变绑定对象的值
int a = 10;
const int &ra = a;
a = 5; //正确
ra = 4; //错误
非const引用不能与const对象绑定,因为常量a的值不可改变,但却可以通过非const引用来改变常量a的值,这样做是错误的,如下:
const int a = 10;
int &ra = a; //错误,非const引用不能绑定到const对象
引用的类型必须与所引用的对象类型一致,但是有例外情况:在初始化常量引用时可以用任意的表达式作为初始值,只要表达式的结果能转换成引用的类型。
double i = 2.33;
const int &r1 = i;//正确
此时上述代码等价与(因为编译器会把其转换成这样来编码)
double i = 2.33;
const int temp = i;
const int &r1 = temp;
此时i为2.33然而r1为2(因为将其转换成了整型)
5.常量成员函数
在c++中,为了禁止成员函数修改数据成员的值,可以将它设置为常量成员函数。设置常量函数的方法是在函数原型后面加上const,如:
class A
{
private:
int i;
int j;
public:
int geti() const;
...
};
-只有类的成员函数才能定义为常量函数,普通函数不能被定义为常量函数,如:
int f(int x) const
{
int b = x * x;
return b;
} //错误,普通函数不能为指定为const