1 共用数据的保护
C++采取了不少有效的措施以增加数据的安全性,例如,设置private私有属性。但是,有些数据却往往是共享的,例如,实参与形参,变量与引用,数据与其指针等,人们可以在不同的场合通过不同的途径访问同一个数据对象。在某些情况下,可能会误操作,引起数据的改变。那么,C++需要提供更多的机制,保护数据的安全性。
例如,即要使数据能在一定范围内共享,又要保证它不被任意修改,这时可以使用const关键字,把有关的数据定义为常量。
2 const定义常对象
在定义对象的时候,指定对象为“常对象”。常对象中的成员变量为常变量,且必须要有初值,如下是一个测试例子:
此时,编译错误,提示异常信息如下:
就是在定义 stud 对象的时候,在 student 类后面,添加了const关键字。此时,这个stud对象成为:常对象。
那么,该stud常对象的数据不可以被修改,甚至调用自己的print()成员函数都不被允许。
定义常对象的一般形式为:
类名 const 对象名[(实参列表)];
也可以把const写在最左面:
const 类名 对象名[(实参列表)]
二者等价。
如果一个对象被声明为“常对象”,则不能调用该对象的非const型的成员函数,除了由系统自动调用的隐式的构造函数和析构函数。
所以,在上面的例子中,定义stud常对象的时候,可以调用student类的构造函数。但是,print()成员函数不是const类型,所以,不可以正常调用。
C++提供的这个常对象机制,是为了防止这些函数会修改常对象中成员变量的值。
编译系统只检查函数的声明,只要发现调用了常对象的成员函数,而且,该函数未被声明为const,就报错,提请编程者注意。
那么,怎么样才能引用常对象中的成员变量呢?很简单,只需将该成员函数声明为const即可,如:
void print() const //将函数声明为const类型
这表示print () 是一个 const 类型的函数,即常成员函数。常成员函数可以访问常对象中的成员变量,但仍然“不允许修改”常对象中的成员变量的值。
有时在编程时有要求,一定要修改常对象中的某个成员变量的值(例如类中有一个用于计数的变量 count,其值应当能不断变化),ANSI C++考虑到实际编程时的需要,对此作出了特殊的处理,对该成员变量声明为 mutable ,如:
mutable int count; //把count 声明为可变的成员变量
这样,就把 count 声明为“可变的成员变量”,这样就可以声明为const的成员函数来修改它的值。如下是测试的例子:
程序的运行结果如下:
可以看到,把print()声明为const类型,那么, stud.print()函数的调用就正常。而且,把student类的成员设置为 mutable类型,那么, student类对象的name, addr等成员变量可以被修改。