几种const类型数据的用法和区别,先总结如下:
形式 | 含义 |
---|---|
Time const t; | t是常对象,其值在任何情况下都不能被改变 |
void 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的指不能改变 |
以下为详细解释:
1 常对象
在定义对象时加关键字const,指定对象为常对象,且常对象必须有初值。
Time const t1(12,23,24); //定义t1为常对象
//在t1的生命周期内,对象t1中的数据成员都不能发生改变。
说明:
- 如果一个对象被声明成常对象,则通过该对象只能调用它的常成员函数,而不能让调用该对象的普通成员函数。
Time const t1(2,4,5);//定义常对象t1
t1.get_time(); //常对象t1调用普通的成员函数,非法,是防止普通的成员函数修改常对象中数据成员的值
如何才能应用常对象当中数据成员呢?将该成员函数声明为const即可。
void get_time() const; //将函数声明为const,表明get_time()是const类型函数,即常成员函数。
- 常成员函数可以访问常对象当中的数据成员,不能修改常对象中数据成员的值。
2 常对象成员
- 常数据成员
在类体中定义了常数据成员hour:
const int hour; //定义hour为常数据成员
- 常成员函数
void get_time() const; //声明一个常成员函数,注意const的位置
注意:常成员函数只不能调用非const的成员函数。
3 指向对象的常指针(指针常量)
将指针变量声明为const型,const和后面的ptr紧挨着,指针变量始终保持不变,不能修改,即其指向不变。
Time t1(1,2,3), t2; //定义对象
Time* const ptr1; //const位置在指针变量名前面,指定ptr1是常指针变量
ptr1 = &t1; //ptr1指向对象t1,此后指针的指向不能变
ptr1 = &t2; //错误,ptr1指向不能改变
//也可以将上述2,3行综合起来
Time* const ptr1 = &t1;
注意:指向对象的常指针变量的指向不能改变,它指向了t1对象,就不能改变,但是不影响t1对象当中值的修改。
4 指向常对象的指针变量(常量指针)
定义一个指向常变量的指向变量ptr:
const char* ptr; //const和char相连,表示指针变量ptr指向的char变量是常变量,不能通过ptr来改变其值。
说明:
- 指针的指向可以修改,但是指针指向的值不能改。
const char c[] = "nihao"; //定义const型的char数组
const char * p1; //定义p1为指向const型的char变量的指向变量
p1 = c; //合法,p1指向常变量
char *p2 = c; //不合法,p2指向常变量的指针变量
- 如果函数的形参是普通的变量的指针变量,实参只能指向普通变量的指针,不能指向const变量的指针。
5 常对象的引用
一个变量的引用就是变量的别名。如果不希望在函数中修改实参t1的值,可以把fun函数的形参t声明为const:
void fun(const Time &t);
这样在函数中就不能改变 t 所代表的实参 t 的值。但此时 t 的指向可以改变,t 所指向的值不能改变。