- 1. 常对象
- 2. 常对象成员
- 3. 指向对象的常指针
- 4. 指向常对象的指针变量
- 5. 对象的常引用
- 6. CONST型数据小结
既要使数据能在一定范围内共享,又要保证它不被任意修改,这时可以使用const,即把有关数据定义为常量
1. 常对象在定义指定对象为常对象时,有以下几点要注意
- 常对象中的数据成员为常变量且必须要有初值
- 常对象不能调用该对象的非const型的成员函数(除系统自调的隐式构造函数及析构函数)
定义常对象的一般形式为:两种定义方式等价
- 类名 const 对象名[(实参表列)]
- const 类名 对象名[(实参表列)]
const Time t(1,2,3); // 定义常对象t,并指定数据成员的初值 t.get_time(); // 企图调用常对象t中的非const型成员函数,非法,编译不通过 void get_time() const; // 将函数声明为常成员函数,常成员函数可以访问常对象中的数据成员,但仍不可修改常对象中数据成员的值 mutable int count; // 把count声明为可变的数据成员,这样就可以用声明为const的成员函数来修改它的值2. 常对象成员
可以在声明类时将成员声明为const,即声明常数据成员和常成员函数
-
常数据成员
- 常数据成员的值不可改变
- 只能通过构造函数的参数初始化表对常数据成员进行初始化
const int hour; // 类体内声明常数据成员hour Time::Time(int h) // 类体外定义构造函数,并对hour赋初值,非法 { hour = h; } Time::Time(int h):hour(h){} // 合法 -
常成员函数
- 常成员函数只能引用本类中的数据成员,而不能修改它的值
- const 是函数类型的一部分,咋声明和定义函数的时候都要有const关键字,在调用时不必加const
详情如下表
数据成员 非const成员函数 const成员函数 非const数据成员 可以引用,也可修改值 可以引用,但不可修改值 const数据成员 可以引用,但不可修改值 可以引用,但不可修改值 const对象的数据成员 不可引用和修改 可以引用,但不可修改值
将指向对象的指针变量声明为const型,并使之初始化,这样指针值始终保持为其初值,不能改变,即其指向始终不变,定义指向对象的长指针一般形式为:类名 * const 指针变量名 = 对象地址
Time t(1,2,3), s; Time * const pt = &t; // 定义指向对象的常指针,指向对象t,此后pt一直指向t,不可修改 pt = &s; // 企图修改指向对象的常指针的指向,非法4. 指向常对象的指针变量
下面通过指向常变量的指针变量的知识,引申指向常对象的指针变量,在内容上两者的概念和使用时类似的,只要将“变量”改为“对象”即可。定义指向变量的指针变量的一般形式为:const 类型名 * 指针变量名
-
如果一个变量已被声明为常变量,只能用指向常变量的指针变量指向它,而不能用非const的指针变量指向它
const char c[] = "boy"; // 定义const型的char数组 const char * p1; // 定义p1为指向const型的char变量的指针 p1 = c; // 合法,指向常变量 char * p2 = c; // 非法,p2不是只想常变量的指针变量
-
指向常变量的指针变量不仅可以指向常变量,还可以指向未被声明为const的变量。此时不能通过此指针变量修改该变量的值
char c1 = 'a'; const char * p; // 定义了一个指向常变量的指针变量p p = &c1; // 使p指向字符变量c1 * p = 'b'; // 非法,不能通过p改变变量c1的值 c1 = 'b'; // 合法,没有通过p访问c1,c1不是常变量
下表为:用指针变量作形参时形参和实参的对应关系
| 形参 | 实参 | 合法? | 改变指针所指向得变量得值 |
|---|---|---|---|
| 指向非const型变量的指针 | 非const变量的地址 | 合法 | 可以 |
| 指向非const型变量的指针 | const变量的地址 | 非法 | / |
| 指向const型变量的指针 | const变量的地址 | 合法 | 不可 |
| 指向const型变量的指针 | 非const变量的地址 | 合法 | 不可 |
一个变量的引用就是变量的别名
实质上,变量名和引用名都是指向同一段内存单元。如果形参为变量的引用名,实参为变量名,则在调用函数进行虚实结合时,并不是为形参另外开辟一个存储空间,而是把实参变量的地址传给形参,这样引用名也指向实参变量
#include6. CONST型数据小结using namespace std; class Time { public: Time(int ,int ,int ); int hour; int minute; int sec; }; Time::Time(int h,int m,int s) { hour = h; minute = m; sec = s; } void fun1(Time &t) { t.hour = 18; } void fun2(const Time &t) // 对象的常引用,不可修改对象t的值 { t.hour = 19; } int main() { Time t1(1,2,3); fun1(t1); // 实参是Time类对象,可以通过引用来修改实参t1的值 cout << t1.hour << endl; fun2(t1); // 非法,因为形参为const型,不可修改实参对应的值 return 0; }
| 形式 | 含义 |
|---|---|
| Time const t1;const Time t1; | t1是常对象,其值再任何情况下都不可改变 |
| void Time::fun() const | fun是Time类中的常成员函数,可以引用,但不能修改类中的数据成员 |
| Time * const p | p是指向Time对象的常指针,p的值不可改变 |
| const Time * p | p是指向Time类常对象的指针,指向的对象的值不能通过该指针来改变 |
| Time &t1 = t | t1是Time类对象t的引用,t和t1指向同一段内存空间 |
下一章:静态成员



