C++隐藏特性,如何使用const保护数据?linux C++第44讲

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等成员变量可以被修改。

举报
评论 0