一.C的const
1.1const的作用
有时候我们希望定义一种变量,其值在整个作用域都不被改变,一旦改变就会报错。这时候就需要const对变量修饰,使其成为常变量,并且在定义的时候要被初始化,定义后不被改变。
const int a=10;
1.2const与指针
const指针位置的不同会有不同的影响
- const int *p:p是一个指向int类型的const指针,p指向的地址可以改变,但是*p无法修改数据。
- int const *p:同上。
- int *const p:p指向的地址不可以改变,但*p可以改变数据。
- const int * const p:p指向的地址可以改变,*p无法修改数据。
const离变量名近就是用来修饰指针变量本身的, 离变量名远就是用来修饰指针指向的数据,如果近的和远的都有, 那么同时修饰指针变量和它指向的数据。
从其他博客看到一种记忆的方法:
const int *p:这个const作用于解引用符 *,*p被定义为常量 ,所以不能修改 *p的值。
int *const p:这个const作用于指针p,指针p指向的地址不能被改变。
const int * const p:两个const分别作用于解引用符 *和指针p,所以既不能改变数据也不能改变p指向的地址。
1.3 const和函数形参
1.在传参过程中形参是指针,为防止在函数内部修改指针指向的数据,故而加上const进行保护。
eg:void StringCopy(const char* str);
给*加上const,那么*str为常量,一旦函数体修改str, 编译器就会报错。
2.当参数是引用,为了提升效率且防止修改
void func(A a);
值传递会产生A类型的临时对象,其中对象的构造,复制,析构消耗时间。
对于内部数据类型的输入参数,就不要将“值传递”的方式改为“const 引用传递”,因为内部数据类型的参数不存在构造、析构的过程,而复制也非常快,“值传递”和“引用传递”的效率几乎相当。
void func(const A&a);
const引用传递就不会产生临时对象,并且不会改变对象。
对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const 引用传递”,目的是提高效率。
二.C++中的const
2.1 C++的const像是编译阶段的#define
const int a=1;
int b=a;
C --- 编译器先到a所在的内存取出一份数据, 再将这份数据赋给另一个b。
C++ --- 编译器直接将1赋值给b。
2.2 C++中全局const变量的可见范围是当前文件
若想在其他文件访问const全局变量,那么在定义的时候就给加上extern。或者直接将其定义在.h的头文件中。