常对象数据成员
只能通过构造函数的参数初始化表对常数据成员进行初始化,任何其他函数都不能对常数据成员赋值。
如:
const int hour;
下面用法是非法的:
Time::Time(int h)
{
hour=h;
}
因为常数据成员是不能被赋值的。
常成员函数
如果将成员函数声明为常成员函数,则只能引用本类中的数据成员,而不能修改它们。
列如:
void get_time()const;
声明常成员函数的一般形式为:
类型名 函数名(参数列表)const;
const是函数类型的一部分,在声明和定义函数时都要有关键字const,在调用时不必加const。
怎么样利用常成员函数呢?
数据成员 | 非const的普通成员 | const成员函数 |
---|---|---|
非const的普通数据成员 | 可以引用,也可以改变值 | 可以引用,但不可以改变值 |
const数据成员 | 可以引用,但不可以改变值 | 可以引用,但不可以改变值 |
const对象 | 不允许 | 可以引用,但不可以改变值 |
常成员函数不能调用另一个非const成员函数。
指向对象的常指针
将指针变量声明为 const 型,这样指针变量始终保持为初值不变,不能改变,即其指向不变。
如:
Time*const ptr1=&t1;//类名*const 指针变量名=&所指向对象名;
可以改变指向对象的值但不能改变本身的地址。
指向常对象的指针变量
如果一个变量已被声明为常变量,只能用指向常变量的指针变量指向它。
const char *ptr;//const 类型名 * 指针变量名
可以改变指针指向但不能改变所指向对象的值。
用指针变量作形参和实参的对应关系
形 参 | 实 参 | 合法否 | 改变指针所指向的变量的值 |
---|---|---|---|
指向非const型变量的指针 | 非const变量的地址 | 合法 | 可以 |
指向非const型变量的指针 | const变量的地址 | 非法 | / |
指向const型变量的指针 | const变量的地址 | 合法 | 不可以 |
指向const型变量的指针 | 非const变量的地址 | 合法 | 不可以 |
当希望在调用函数时对象的值不被修改,就应当把形参定义为指向常对象的指针变量,同时用对象的地址作实参(对象可以是 const 或非 const型)。 如果要求该对象不仅在调用函数过程中不被改变,而且要求它在程序执行过程中都不改变,则应把它定义为const型。
对象的常引用
void fun(const Time &t);
不希望再函数中修改实参的值,可以把fun函数的形参声明为const,这样就不能改变实参的值。
const 型数据小结
形式 | 含义 |
---|---|
Time const t; | t 是常对象,其值在任何情况下都不能改变 |
viod Time::fun( )const; | fun 是 Time 类中的常成员函数,可以引用,但不能修改类中的数据成员 |
Time * const p; | p 是指向 Time 类对象的常指针变量,p 的值(p的指向)不能改变 |
const Time * p; | p 是指向 Time 类常对象的指针变量,p 指向的类对象的值不能通过 p 来改变 |
const Time &t1=t; | t1 是 Time 类对象 t 的引用,二者指向同意存储空间,t 的值不能改变 |
注:当成员变量加上mutable后,常对象可以修改其值
mutable int x;
这样的x可以被常函数修改值,常对象也可以修改其值。