c++ const变量
1.常变量
1.1.定义:在定义变量时,如果加上关键字const,则变量的值在程序运行期间不能改变。
1.2.在定义常变量时必须同时对它初始化(即指定其值),此后这的值不能再改变。如:
    const int a=3;  //正确
    如下面是错误的:
    const int a;
    a=3;            //常变量不能被赋值

2.对象中的常数据成员
2.1.只能通过构造函数的参数初始化表对常数据成员进行初始化。
2.2.不能采用在构造函数中对常数据成员赋初值的方法。

3.指向对象的常指针:
3.1.定义指向对象的常指针的一般形式为:
    类名 * const 指针变量名;
    也可以在定义指针变量时使之初始化,如:
    Time * const ptr1=&t1;  //指定ptr1指向t1
3.2.注意点:
    指向对象的常指针变量的值不能改变,即始终指向同一个对象,但可以改变其所指向对象(如t1)的值。
3.3.指向对象的常指针的使用场合:
    如果想将一个指针变量固定地与一个对象相联系(即该指针变量始终指向一个对象),可以将它指定为 const型指针变量。这样可以防止误操作,增加安全性。
3.4.往往常指针作为函数的形参,目的是不允许在函数执行过程中改变指针变量的值,使其始终指向原来的对象。

4.指向常变量的指针变量
4.1.定义指向常变量的指针变量的一般形式为:
    const 类型名 *指针变量名; 例如:const char *ptr;
4.2.说明:
    (1)如果一个变量已被声明为常变量,只能用指向常变量的指针变量指向它,
     而不能用一般的(指向非const型变量的)指针变量去指向它。如
     const char c[]="boy";    //定义const型的char数组
     const char *p1;         //定义p1为指向const型的char变量的指针变量
     p1=c;                   //合法,p1指向常变量(char数组的首元素)
     char *p2=c;             //不合法,p2不是指向常变量的指针变量
    (2)指向常变量的指针变量除了可以指向常变量外,还可以指向未被声明为const的变量。
     此时不能通过此变量改变该变量的值。如:
     char c1='a';   //定义字符变量c1,它并未声明为const
     const char *p; //定义了一个指向常变量的指针变量p
     p=&c1;         //使p指向字符变量c1
     *p='b';        //非法,不能通过p改变变量c1的值
     c1='b';        //合法,没有通过p访问c1,c1不是常变量
    (3)如果函数的形参是指向非const型变量的指针,实参只能用指向非const变量的指针,
     而不能用指向const变量的指针,这样,在执行函数的过程中可以改变形参指针变量所指向
     的变量(也就是实参指针所指向的变量)的值。
     如果函数的形参是指向const型变量的指针,在执行函数过程中显然不能改变指针变量所
     指向的变量的值,因此允许实参指向const变量的指针,或指向非const变量的指针。如:
     const char str[]="boy"; //str是const型数组名
     void fun(char *ptr);    //函数fun的形参是指向非const型变量的指针
     fun(str);           //调用fun函数,实参是const变量的地址,非法
    (4)总结:指向常变量的指针变量可以指向const和非const型的变量,而指向非const型变量
     的指针变量只能指向非const的变量。

5.指向常对象的指针变量
5.1.指向常变量的指针变量,指向常对象的指针变量的概念和使用是与此类似的,只要将"变量"
    换成"对象"即可。
5.2.如果一个对象已被声明为常对象,只能用指向常对象的指针变量指向它,
     而不能用一般的(指向非const型对象的)指针变量去指向它。
5.3.如果定义了一个指向常对象的指针变量,并使它指向一个非const的对象,则其指向的对象
    是不能通过指针来改变的。如:
    Time t1(10,12,15);   //定义Time类对象t1,它是非const型对象
    const Time *p=&t1;  //定义p是指向常对象的指针变量,并指向t1
    t1.hour=18;         //合法,t1不是常变量
    (*p).hour=18;       //非法,不能通过指针变量改变t1的值
    注:如果希望在任何情况下t1的值都不能改变,则应把它定义为const型对象,如:
    const Time t1(10,12,15);
5.4.注意指向常对象的指针变量与指向对象的常指针变量在形式上和作用上的区别.
    Time *const p;   //指向对象的常指针变量
    const Time *p;   //指向常对象的指针变量
5.5 指向常对象的指针常用于函数的形能,目的是在保护形参指针所指向的对象,使
    它在函数执行过程中不被修改。
5.6.当希望在调用函数时对象的值不被修改,就应当把形能定义为指向常对象的指针变量,
    同时用对象的地址作实参(对象可以是const或非const型)。
    如果要求该对象不仅在调用函数过程中不被改变,而且要求它在程序执行过程中都不改变,则应把这 定义为const型。
5.7.如果定义了一个指向常对象的指针变量,是不能通过它改变所指向的对象的值的,但是指针变量本身的值是可以改变的。如:
    const Time *p=&t1; //定义指向常对象的指针变量p,并指向对象t1
    p=&t2;             //p改为指向t2,合法

6.对象的常引用
6.1.如果不希望在函数中修改实参t1的值,可以把引用变量t声明为const(常引用),函数原型为:
    void fun(const Time &t);
    则在函数中不能改变t的值,也就是不能改变其对应的实参t1的值。

7.在C++面向对象程序设计中,经常用常指针和常引用作函数参数,这样既能保证数据安全,使数据不能被随意修改,在调用函数时又不必实参的拷贝。用常指针和常引用作函数参数,可以提高程序运行效率。
8.用常对象作函数参数较少,因其内存开销开。

9.以上参考谭教授<C++程序设计>教程,在些感谢!

    加速度 February.24.2010

转自:http://blog.21ic.com/user1/6121/archives/2010/66976.html