--

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 的引用,毕竟我们得到的这个对象,和在函数里面提供给我们的,是同一份东西。

我们最好是使用这个返回的到的对象,而不去改变它,因为改变它之后,函数内部提供给我们的原始的那个对象,也会发生变化,这往往是不可控的。