6.1常对象
定义常对象的一般形式为:
类名 const 对象名 [(实参表)];在定义常对象前,必须同时对之初始化,之后不能再改变。
说明:
1)如果一个对象声明为常对象,则通过该对象只能调用它的常成员函数,而不能调用该对象的普通成员函数(除了构造函数和析构函数)。
2)常成员函数可以访问常对象中的数据成员,但仍然不允许修改常对象中的数据成员的值。
3)常对象只保证其数据成员是常数据成员,其值不被改变。不保证成员函数是常成员函数。
如果编程时有要求,一定要修改常对象中的某个数据成员的值,对该数据成员声明为mutable,例如 mutable int count;
这样便可以用声明为const的成员函数来修改它的值。
6.2 常对象成员
6.2.1常数据成员
用const关键字来声明常数据成员,只能通过构造函数的参数初始化表对常数据成员进行初始化,任何其他函数不能对常数据成员进行赋值。
6.2.2常成员函数
声明常成员函数的一般形式为:
类型名 函数名(参数表)const
如果将成员函数声明为常成员函数,则只能引用本类中的数据成员,而不能修改它们。
注意:常成员函数不能调用另一个非const成员函数。
6.3 指向对象的常指针
将指针变量声明为const型,这样指针变量始终保持为初值,不能改变,即其指向不变。
定义指向对象的常指针变量的一般形式为
类名 *const 指针变量名;
注意:指向对象的常指针变量的值不能改变,即始终指向同一个对象,但可以改变其所指向对象的值。
如果想将一个指针变量固定地与一个对象相联系(即该指针变量始终指向一个对象),可以将它指定为const型指针变量。
往往用常指针作为函数的形参,目的是不允许在函数执行过程中改变指针变量的值,使其始终指向原来的对象。
6.4指向常对象的指针变量
定义指向常变量的指针变量的一般形式为
const 类型名 *指针变量名
说明:
(1)如果一个变量已被声明为常变量,只能用指向常变量的指针指向它,而不能用一般的(指向非const型变量的)指针变量去指向它。
(2)指向常变量的指针变量除了可以指向常变量,还可以指向未被声明为const的变量。此时不能通过此指针变量改变该变量的值。(定义了指向常变量的指针变量p并使它指向c1,并不意味着把c1也声明为常变量,而只是在用指针变量访问c1期间,c1具有常变量的特征,其值不能改变。在其他情况下,c1仍然是普通变量,其值是可以改变的)
(3)如果函数的形参是指向普通(非const)变量的指针变量,实参只能用指向普通(非const)变量的指针,而不能用指向const变量的指针。
(4)指向常对象的指针最常用于函数的形参,目的是保护形参指针所指向的对象,使它在函数执行过程中不被修改。
6.5 对象的常引用
声明常引用,则不能改变引用所指向的变量的值。
在c++面向对象程序设计中,经常使用常指针和常引用作为函数参数。这样既能保证数据安全,使数据不能随意修改,在调用函数时又不必建立实参的拷贝。
6.6 const型数据小结
形式 | 含义 |
Time const t; | 常对象,其值在任何情况下都不能改变 |
void Time:: fun() const | 常成员函数,可以引用,但不可以修改本类中的数据成员 |
Time * const p | 常指针变量,指向不能改变 |
const Time *p | 指向常对象的指针变量,不能通过指针来修改对象的值 |
const Time &t1 = t; | 对象的常引用,t的值不能修改 |