c 语言中的 const 关键字用法
在 c 语言中,对于 const 关键字,很容易记错,我做了一下小小的总结:
1. 定义一个整数变量
int a;
int b = 6;
2. 定义一个指向整数变量的指针:
int a = 6;
int * pa = &a;
3. 定义一个常量,并且在申明的时候给定值的大小。(在申明了之后我们无法赋值了)
int const a = 5;
const int b = 6;
这里,const 关键字 位于 int 左边还是右边,都是同样的效果。
4. 定义一个指针,这个指针指向一个整数常量
我们只要在 3 的基础上写一个 * 就好了
int const a = 5;
int const b = 6;
int const * pa = &a;
pa = &b;
const int *pb = &b;
pb = &b;
5. 定义一个常量指针,这个指针指向一个整数。
也就是说,这个指针永远指向一块固定的内存,不能改变这个指针使得它指向别的地址。
但是我们可以改变这块内存的内容。
int a = 5;
int * const pa = &a;
*pa = 6;
// 此时 a 被改变为6
6. 定义一个 function,他的参数是 const 的
这表示,在function 内部,参数是不能被改变的。
一般我们往往和 引用一起使用,使得在参数被调用的时候,不必要重新copy 参数,而是直接利用参数,同时又保证不改变参数。
Pointer center(const Pointer &a, const Pointer &b)
{
Pointer p = (a + b) / 2;
return p;
}
这里利用 引用避免了复杂的数据结构 Pointer a 和 b 在函数调用过程中的复制开销,又避免了在函数内部 a 和 b 被一不小心改变掉。
7. 定义一个 类的成员函数,该成员函数是 const 的
表示这个成员函数的调用,不会改变类的成员的大小,比如说,该函数是一个 get 类型的函数而不是一个 set 类型的函数。
class Cls{
public:
Cls(int d = 0){_d = d;}
int get() const {return _d;}
void set(int d) {_d = d;}
}
8. 函数返回一个引用
注意我们不能随便返回一个引用,比如我们返回一个对于函数内部局部变量的引用,这是错误的,因为在离开函数的时候,这个局部变量就不存在了。
我们可以返回一个持久存在的变量的引用,比如我们可以返回一个全局变量或者 static 变量的引用,因为他们在退出函数的时候是持久存在的。
同时,我们也可以让一个类成员函数返回一个类成员的引用,至少在我们退出这个函数的时刻,这个类的对象和它的成员肯定还是存在的,返回的引用也还是有意义的。
一般的,我们往往会希望返回一个 const 的引用,毕竟我们得到的这个对象,和在函数里面提供给我们的,是同一份东西。
我们最好是使用这个返回的到的对象,而不去改变它,因为改变它之后,函数内部提供给我们的原始的那个对象,也会发生变化,这往往是不可控的。