在类中,我们知道用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:
如果不想改变t1.hour的值,只需将fun中改为fun(const Time &t);即可。在c++面向对象程序设计中,常用到常指针和常引用做函数参数,既能保证数据不被修改,而且不必建立实参的拷贝,提高了程序的运行效率。
Time const t; // t是常对象,其值在任何情况不改变。
void Time::fun()const; // 常成员函数,调用常数据成员,不修改数据成员的值。
Time * const p; // 常指针,指向Time类对象,指针变量的值不变,但可通过此指针变量改变指向对象的值。
const Time *p; // 指向Time类常对象的指针变量,指针变量值可变,但不能通过此指针变量改变指向常对象的值。
const Time &t=t1; // 常引用,t1是t的常引用,二者指向同一存储空间,但t的值不会改变。