• 要使数据能在一定范围内共享,又要保证它不被修改,这时可以使用const,即把有关的数据定义为常量。

    1.常类型

    • 常类型的对象**必须进行初始化**,而且不能被更新
    • 一般定义形式:**const 类名 对象名**
    • 常对象成员:
      • 常数据成员 **const 数据成员声明**
      • 常成员函数** 成员函数声明 const**


    2.常对象**

    • 数据成员不被改变的对象,可声明为常对象。

      • 常对象必须要有初值,
        1. Time const t1(12,34,46); //t1是常对象,在所有的场合中,t1中的所有成员
        2. //的值都不能被修改
    • 定义常对象的一般形式为:类名 const 对象名[(实参表列)];或把const写在最左面:const 类名 对象名[(实参表列)]

    • 不能调用常对象的非const型的成员函数(除了由系统自动调用的隐式的构造

    函数和析构函数)。

    1. const Time t1(10,15,36); //定义常对象t1
    2. t1.get_time( ); //企图调用常对象t1中的非const型成员函数,非法
    • 引用常对象中的数据成员需将该成员函数声明为const

      1. void get_time( ) const; //将函数声明为const表示get_time是一个常成员函数
      • **常成员函数可以访问常对象中的数据成员,但仍然不允许修改**常对象中数据成员的值

    **

    • 有时一定要修改常对象中的某个数据成员的值,可对该数据成员声明为mutable
      1. mutable int count;//把count声明为可变的数据成员,这样可
      2. //以用声明为const的成员函数来修改它的值

    2.常对象成员

    • 常数据成员

      • 用const声明常数据成员,作用和用法与一般常变量相似

        1. const int hour;//类体中定义了常数据成员
      • 常数据成员的值是不能改变的,只能通过构造函数的参数初始化表对常数据成员进行初始化。不能采用在构造函数中对常数据成员赋初值的方法

      • 常对象的数据成员都是常数据成员,因此常对象的构造函数只能用参数初始化表对常数据成员进行初始化
    • 常成员函数

      • 一般的成员函数可以引用本类中的非const数据成员,也可以修改它们

        • 如果将成员函数声明为常成员函数,则只能引用本类中的数据成员,而不能修改它们

          1. void get_time( ) const; //const的位置在函数名和括号后
        • const是函数类型的一部分,在声明函数和定义函数时都要有const关键字,在调用时不必加const


    数据成员 非const成员函数 const成员函数
    非const数据成员 可以引用,但不可以改变值 可以引用,但不可以改变值
    const数据成员 可以引用,但不可以改变值 可以引用,但不可以改变值
    const对象的数据成员 不可以引用和改变值 可以引用,但不可以改变值
    • 常类型
      • 指向对象的常指针 :**类名 const 指针变量名*
      • 指向常对象(变量)的指针变量:** const 对象名(变量类型) 指针变量名;*
      • 常引用:被引用的对象不能被更新
        • const 类型说明符 &引用名
      • 常数组:数组元素不能被更新,需进行初始化赋值。
        • 类型说明符 const 数组名[大小]…


    3.指向对象的常指针**

    • 将指针变量声明为const型,这样指针值始终保持为其初值,不能改变。

      1. Time t1(10,12,15),t2; //定义对象
      2. Time * const ptr1; //const位置在指针变量名前面,规定ptr1的值是常值
      3. ptr1=&t1; //ptr1指向对象t1,此后不能再改变指向
      4. ptr1=&t2; //错误,ptr1不能改变指向
    • 定义指向对象的常指针的一般形式为: 类名 * const 指针变量名;**

      • 也可以在定义指针变量时使之初始化:
        1. Time * const ptr1=&t1; //指定ptr1指向t1

    4.指向常对象的指针变量

    • 定义一个指向常变量的指针变量

      1. const char*ptr;
      • 指针变量ptr指向的char变量是常变量,不能通过ptr来改变其值。
    • 定义指向常对象的指针变量的一般形式:const **对象名 *指针变量名;**

    **

    形参 实参 规则 改变指针所指变量的值
    指向非const变量的指针 非const变量的地址 合法 可以
    指向非const变量的指针 const变量的地址 非法 /
    指向const变量的指针 const变量的地址 合法 不可以
    指向const变量的指针 非const变量的地址 合法 不可以

    5.对象的常引用

    • 一个变量的引用就是变量的别名。
      • 变量名和引用名都指向同一段内存单元。
    • 如果不希望在函数中修改实参t1的值,可以把引用变量t声明为const(常引用)

      1. void fun(const Time &t);
      • 则在函数中不能改变t的值,也就是不能改变其对应的实参t1的值


    • 使用常指针和常引用作函数参数,既能保证数据安全,使数据不能被随意修改,在调用函数时又不必建立实参的拷贝

      1. #include <iostream>
      2. using namespace std;
      3. class Time
      4. {public:
      5. Time(int,int,int);
      6. int hour;
      7. int minute;
      8. int sec;
      9. };
      10. Time Time(int h,int m,int s) //定义构造函数
      11. {hour=h;
      12. minute=m;
      13. sec=s;
      14. }
      15. void fun(Time &t) //形参t是Time类对象的引用
      16. {t.hour=18;}
      17. int main( )
      18. {
      19. Time t1(10,13,56); // t1是Time类对象
      20. fun(t1); //实参是Time类对象,可以通过引用来修改实参t1的值
      21. cout<<t1.hour<<endl; //输出t1.hour的值为18
      22. return 0;
      23. }
    • 如果不希望在函数中修改实参t1的值,可以把引用变量t声明为const(常引用)

      void fun(const Time &t);
      

    6.const型数据的小结

    形式 含义
    Time const t1; t1是常对象,其值在任何情况下都不能改变
    void Time::fun( )const fun是Time类中的常成员函数,可以引用,但不能修改本类中的数据成员
    Time * const p; p是指向Time对象的常指针,p的值(即p的指向)不能改变
    const Time *p; p是指向Time类常对象的指针,其指向的类对象的值不能通过指针来改变
    Time &t1 = t; t1是Time类对象t的引用,二者指向同一段内存空间

    **