用const实现对数据的保护

       在类中,我们知道用private来保护数据,增加数据的安全性,但是有时候有些数据是共享的,例如形参和实参,变量和它的引用,数据和它的指针,这些都可以通过不同的方式来访问,可能在不经意间会改变本来不想改变的值,造成数据破坏。既要实现数据的共享,又不想数据可能因误操作而改变,我们可以采用将这些数据定义为常量,使之不可改变。

1、常对象

      在定义对象时加关键字“const”,将对象定义为常量:         const   类名    对象名  (实参)

例如:

                  const Time t1(10,20,30);

(1)t1为常对象,它的所有数据成员都不能修改 ,另外只能调用它的常成员函数,不能调用其他普通函数,防止数据被修改。 

(2)常成员函数只能访问对象的数据成员,并不能修改任何数据和成员的值。 

(3)常对象只保证其数据成员为const,并不是常对象中的成员函数都是const。

(3)特殊情况下,需修改数据成员的值,需要对该数据成员声明为mutable,如:mutable int count;   

2、常对象成员

     可以将对象的成员声明为const,包括常数据成员和常成员函数:

    (1)  常数据成员

             只能通过构造函数的参数初始化表对常数据成员进行初始化,任何其他函数都不能对常数据成员进行赋值,例如:

             const  int hour;

             Time::Time(int h):hour(h){}

    (2)、常成员函数

            如果将成员函数声明为const,则只能引用本类数据成员中的常数据成员;

                  类型名  函数名  (参数表)const

            例如:void get _time() const;

     在一个类中,有些数据可以变,一些不可以,用非const成员函数调用和修改可以改变的数据成员,用const成员函数调用const数据成员;如果在一个类中所有数据都不能改变,可以将所有数据成员声明为const或将类声明为const,然后用const函数调用这些数据成员。

3、常指针(指针指向不变,可通过此指针使指向的对象的值可变)

     将指针变量声明为const,指针变量的值不会改变,即指针指向不变。如果想将一个指针变量固定的与一个对象联系,则可以将指针变量定义为const,往往用常指针作为函数的形参,目的是不允许函数在执行过程中改变指针变量的值,使其始终指向原来的对象。

                   类名  *const   指针变量名

例如;

             Time t1(10,20,30),t2;

             Time *const p;

             p=&t1;      //p1的指向不会再改变

4、指向常对象的指针变量(指针变量的指向可变,但不能通过此指针改变对象的值)

          1.常对象只能用指向常对象的指针指向它,不可以用一般的指针变量。

          2.指向常对象的指针变量指向非const对象,非const对象的值不能通过此指针变量来改变。

          3.指向常对象的指针变量常用于函数形参,保护形参指针所指对象在函数执行过程中不被修改。

          4.希望在调用函数时对象的值不被修改,就应当把形参定义为指向常对象的指针变量,同时用对象的地址来做实参

5、对象的常引用

      一个变量的引用就是变量的别名,如果形参为变量的引用,实参为变量名,在调用函数是虚实结合,把实参的地址传给形参(传址方式)。同样的,对象类似,把引用声明为const:

用const实现对数据的保护_第1张图片


如果不想改变t1.hour的值,只需将fun中改为fun(const Time &t);即可。在c++面向对象程序设计中,常用到常指针和常引用做函数参数,既能保证数据不被修改,而且不必建立实参的拷贝,提高了程序的运行效率。

const小结

       Time const t;    //  t是常对象,其值在任何情况不改变。

       void Time::fun()const;  //  常成员函数,调用常数据成员,不修改数据成员的值。

       Time * const p;   //  常指针,指向Time类对象,指针变量的值不变,但可通过此指针变量改变指向对象的值。

       const Time *p;    //  指向Time类常对象的指针变量,指针变量值可变,但不能通过此指针变量改变指向常对象的值。

       const Time &t=t1;    //  常引用,t1是t的常引用,二者指向同一存储空间,但t的值不会改变。

你可能感兴趣的:(C++学习笔记)