3.3.3 const成员函数
如果一个成员函数不需要直接或间接(通过调用其他的成员函数来改变其对象状态)地改变该函数所属对象的任何数据成员,那么最好将这个成员函数标记为const。
例3-15
本例中,由于get成员函数不需要改变类C的任何数据成员,因此我们将get成员函数标记为const。请注意,定义一个const成员函数时,const关键字出现在参数列表与其函数体之间。
由于get成员函数不更改任何数据成员,因此我们称这种类型的函数为只读函数。将成员函数标记为const可以预防对该函数所属对象的数据成员的误写,同时有些编译器还可对这种情况进行一些优化。
成员函数set不能标记为const,因为它通过设置数据成员num的值而改变了对象的状态。如果成员函数set被错误地标记为const,则编译器将产生一条严重错误。
一个const成员函数仅能调用其他const成员函数,因为const成员函数不允许直接或间接地改变对象的状态,而调用非const成员函数可能会间接地改变对象的状态。
例3-16
本例类C包含一个错误。因为m1标记为const,因此m1不能调用非const成员函数m2,因此,编译器将发出一条严重错误。如果允许m1调用非const成员函数m2,由于m2设置了数据成员dm的值,m1会间接地改变对象的状态,这是不允许的。
例3-17
本例展示了const关键字的三种不同用法。在成员函数set中,因为set不改变string类型参数n,n被标记为const。成员函数get返回数据成员name的一个const型引用,此处的const表明谁也不能通过这个引用来修改数据成员name的值。成员函数get本身被标记为const,因为get不会改变类C 惟一的数据成员name的值。