只读”。

    一、const的各种用法:

    1、修饰变量

    const int a/int const a:表示a是一个常量。

    const int *a:表示a是一个指向常量的指针,*a是不能被修改的,但是a可以被修改。

    int * const a:表示a是一个指向整数的常指针,a是不能被修改的,但是*a是可以被修改的。

    const int * const a:表示a是一个指向常量的常指针,*a是不能被修改的,a也是不能被修改的。

    2、在函数参数中使用const

    传递过来的参数在函数内不能改变,与修饰变量性质一样。

    void display(const int a,int b){a=5;}//错误。

    3、const修饰成员函数

mutable修饰的变量除外)。

    (2)加了const的成员函数可以被非const对象和const对象调用,但不加const的成员函数只能被非const对象调用.const成员函数不能调用非onst成员函数,因为非const成员函数可能会修改成员变量。

void testConstFunction(int _x) const
     {
         x=_x;错误,在const成员函数中,不能修改任何类成员变量
         modify_x(_x);错误,const成员函数不能调用非onst成员函数,因为非const成员函数可以会修改成员变量
     }
     void modify_x(int _x)
     {
         x=_x;    
     }

    只要类方法不修改调用对象,就应该将其申明为const。

    4、const修饰函数返回值

    若函数的返回值是指针,且用const修饰,则函数返回值指向的内容是常数,不可被修改,此返回值仅能赋值给const修饰的相同类型的指针。如果返回值是对象,要注意确定函数究竟是想返回一个对象的“copy”,还是仅返回对象的“别名”。

    二、为什么要使用const:

给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。可以避免无意中由于修改数据造成的编程错误。

能够处理const和非const实参。

能产生更紧凑的代码。


    三、const和#define的区别

const定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静态区),而#define定义的宏常量在内存中有若干个拷贝。
    #define宏是在预编译阶段进行替换,而const修饰的只读变量是在编译的时候确定其值。#define宏没有类型,而const修饰的只读变量具有特定的类型。