目录
C++虽然采取了不少有效的措施(如设private保护)以增加数据的安全性,但是有些数据却往往是共享的,例如实参与形参、变量及其引用、数据及其指针等,可以在不同的场合通过不同的途径访问同一个数据对象。有时在无意之中的误操作会改变某些数据的状况。既要使数据能在一定范围内共享,又要保证它不被任意修改,这时可以把有关的数据定义为常量。
1.常对象
可以在定义对象时加关键字const,指定对象为常对象。常对象必须要有初值,如Time const t1(12,34,56); 这样,在t1的生命周期中,对象t1中的所有数据成员的值都不能被修改。凡希望保证数据成员不被改变的对象,都可以声明为常对象。
定义常对象的一般形式为:类名 const 对象名[(实参表)] 或者 const 类名 对象名[(实参表)]。两种形式等价。在定义常对象时,必须同时对之进行初始化,之后不能再改变。
说明:
(1)如果一个对象被声明为常对象,则通过该对象只能调用它的常成员函数,而不能调用该对象的普通成员函数(除了由系统自动调用的隐式的构造函数和析构函数)。常成员函数是常对象唯一的对外接口。
(2)常成员函数可以访问常对象中的数据成员,但仍然不允许修改常对象中数据成员的值。
以上两点(不能调用常对象中的普通成员函数和常成员函数不能修改对象的数据成员),就保证了常对象中的数据成员的值绝对不会改变。但有时在编程时有要求,一定要修改常对象中的某个数据成员的值,C++提供的特殊的处理方式,即将该数据成员声明为mutable。如mutable int count; 把count声明为可变的数据成员,这样就可以用声明为const的成员函数来修改它的值。
2.常对象成员
可以将对象的成员声明为const,包括常数据成员和常成员函数。
(1)常数据成员
常数据成员的作用和用法与一般常变量相似,用关键字const来声明常数据成员。常数据成员的值是不能改变的。注意:只能通过构造参数的参数初始化表对常数据成员进行初始化,任何其他函数都不能对常数据成员赋值。
如在类体中定义了常数据成员hour:const int hour; 不能采用在构造函数中对常数据成员赋初值的方法,如下面的用法是非法的:
Time::Time(int h){
hour = h;