C++ 常指针、常引用、常对象
常成员
常成员是指使用常类型修饰const
说明的成员,包括常数据成员和常成员函数。
常数据成员(常字段)
对于常数据成员,在任何函数中都不能对它赋值,也不能更新。只能通过构造函数的成员初始化列表来对常数据成员进行初始化。
格式:<构造函数名>(参数表):<成员初始化列表>
举例:
class A{
public:
//构造函数的成员初始化列表
A::A(int a, int b):Ca(a) { Cb=b; }
private:
const int Ca; //常数据成员(常字段)
int Cb; //普通数据成员(普通字段)
}
因此,定义常数据成员的语法为:const <类型> <成员名(字段名)>
。
const int &x; //常int型引用
const int a; //常int型变量
static const int b; //静态常int型变量
常成员函数(常方法)
格式:<类型说明符> <函数名> (<参数表>) const
举例:
int getHout() const;
void show() const;
常对象
常对象是指被const
修饰的对象。定义常对象时,同样要进行初始化,并且该对象不能再被更新。
格式:
<类名> const <对象名>
或者
const <类名> <对象名>
举例:
class A{
public:
...
private:
...
}
const A obj1(); //常对象,以后不能被更新
A const obj2(); //常对象,以后不能被更新
常指针
常指针时指使用const
说明的指针。有两种含义不同的常指针:
- 地址值是常量的常指针(地址值是常量,但指向的值可改变)
格式:<类型> *const <指针名> = <初值>
举例:/*Examp1*/ char *str1 = "THRFUR"; char *str2 = "WWW.THRFUR.COM"; char *const *Cstr = str1; //Cstr是常指针,地址值是常量,并指向str1 Cstr = str2; //错误,不允许改变Cstr的指向 strcap(Cstr,"THRFUR.COM"); //允许,可以改变该地址指向的值的值 /*Examp2*/ Person p1, p2; //定义两个类Person的对象p1、p2 Person *const Cp = &p1; //定义指向p1的常量指针Cp Cp = &p2; //错误,不允许改变指向
- 所指向的值是常量的常指针(地址所指向的值是常量,但地址值可改变)
格式:const <类型> *<指针名> = <初值>
举例:const char *str1 = "THRFUR"; *str2 = "WWW.THRFUR.COM"; const char *Cstr = str1; //Cstr是指针常量,指向str1字符串常量 Cstr = str2; //正确,可以改变Cstr的地址指向 strcpy(Cstr,"THRFUR.COM"); //错误,不可以改变其指向的值
指向常对象的指针
举例:
class Time{
public:
...
private:
...
}
void fun1(const Time *CT){
CT -> setHour(18); //错误,该函数会改变hour的值
}
指向常对象的指针可以用常对象赋值,也可以用一般对象的地址值赋值,地址值是可以改变的,但不能通过该指针改变对象值。
在实际中,常指针、常引用、常对象,往往用来作函数的形参,称为常参数。