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的值
}

指向常对象的指针可以用常对象赋值,也可以用一般对象的地址值赋值,地址值是可以改变的,但不能通过该指针改变对象值。

在实际中,常指针、常引用、常对象,往往用来作函数的形参,称为常参数。