既要使数据能在一定范围内共享,又要保证它不被任意修改,这时可以使用const,即把有关数据定义为常量
在定义指定对象为常对象时,有以下几点要注意
定义常对象的一般形式为:两种定义方式等价
const Time t(1,2,3); // 定义常对象t,并指定数据成员的初值
t.get_time(); // 企图调用常对象t中的非const型成员函数,非法,编译不通过
void get_time() const; // 将函数声明为常成员函数,常成员函数可以访问常对象中的数据成员,但仍不可修改常对象中数据成员的值
mutable int count; // 把count声明为可变的数据成员,这样就可以用声明为const的成员函数来修改它的值
可以在声明类时将成员声明为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 指针变量名 = 对象地址
Time t(1,2,3), s;
Time * const pt = &t; // 定义指向对象的常指针,指向对象t,此后pt一直指向t,不可修改
pt = &s; // 企图修改指向对象的常指针的指向,非法
下面通过指向常变量的指针变量的知识,引申指向常对象的指针变量,在内容上两者的概念和使用时类似的,只要将“变量”改为“对象”即可。定义指向变量的指针变量的一般形式为: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变量的地址 | 合法 | 不可 |
一个变量的引用就是变量的别名
实质上,变量名和引用名都是指向同一段内存单元。如果形参为变量的引用名,实参为变量名,则在调用函数进行虚实结合时,并不是为形参另外开辟一个存储空间,而是把实参变量的地址传给形参,这样引用名也指向实参变量
#include
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指向同一段内存空间 |