C++关键字 const

473 阅读4分钟

个人主页:二郎腿 (erlangtui.top)


一、常变量

  • 声明方式:const 变量类型 变量名,或 变量类型 const 变量名
  • 该变量需要在声明时被初始化,后续不允许再被直接改变;
  • const 修饰的是变量,即变量不可被改变;
  • 示例:
const int a;      // 编译错误,需要初始化
const int b = 1;  // 正确
int const c = 2;  // 正确
b = 3;            // 错误,不允许改变常量的值

二、常引用

  • 声明方式:const 变量类型 &变量名,或 变量类型 const &变量名
  • 该引用需要在声明时被初始化,后续不允许再被直接改变;
  • const 修饰的是引用,即引用不可被改变;
  • 示例:
int a = 1;          // 正确
const int &b;       // 编译错误,需要初始化
const int &c = a;   // 正确
int const &d = a;   // 正确
b = c;              // 错误,不允许改变常引用的值

三、常指针

  • 声明方式:const 变量类型 *变量名,或 变量类型 const *变量名
  • 该指针的值是其指向变量的地址,可以被改变,所以不需要在声明时被初始化,但该指针指向的值不允许被改变
  • const 修饰的是该指针指向的变量,而不是该指针的值
  • 示例:
int a = 1;          // 正确
const int *b = &a;  // 正确
int const *c = &a;  // 正确
const int *d;       // 正确,不需要在创建时初始化
d = &a;             // 正确,允许改变指针变量的值
*d = 3;             // 错误,不允许改变指针指向的值

四、指针常量

  • 声明方式:变量类型 *const 变量名
  • 该指针的值不可以被改变,需要在声明时被初始化,但该指针指向的值允许被改变
  • const 修饰的是该指针的值,而不是该指针指向的值
  • 示例:
int a = 1;          // 正确
int *const b = &a;  // 正确
int *const c;       // 错误,需要再声明的时候初始化
*b = 2;             // 正确,允许改变指针指向的值

// 左边const修饰指针指向的值,右边const修饰指针的值
const int *const d = &a;  // 正确
d = &b;                   // 错误,指针的值不允许被改变
*d = 3;                   // 错误,指针指向的值不允许被改变        

五、常对象

  • 被 const 修饰的对象称为常对象,等同于上述的常变量,只不过变量类型是自定义的类型,而非内置类型;
  • 常对象只能访问 const 成员函数,而非 const 对象可以访问任意的成员函数,包括const成员函数;
  • 常对象在其初始化后不能被修改,其成员变量也自动成为常量
  • 常对象的成员是不能被直接修改的,不过可以通过指针操作去修改(不建议);
class myClass
{
private:
    int data;

public:
    myClass(){};
    ~myClass(){};

    int get() const
    {
        return data;
    }
    int get_data()
    {
        return data;
    };
};

int main(int argc, char **argv)
{
    const myClass m;
    int a = m.get();      // 正确,常对象调用常成员函数
    int b = m.get_data(); // 错误,常对象调用非常成员函数

    myClass n;
    int c = n.get();      // 正确,普通对象可以调用常成员函数
    int d = n.get_data(); // 正确,普通对象可以调用非常成员函数
}

六、常成员函数

  • 常成员函数不可以修改对象的数据,不管对象是否具有const性质,编译时以是否修改成员数据为依据进行检查;
  • const 修饰的是该成员函数,该函数对成员变量不能有写的操作
class myClass
{
private:
    int data;

public:
    myClass(){};
    ~myClass(){};

    void set(int d) const
    {
        data = d; // 错误,常成员函数不能修改成员变量
    };
    int get() const
    {
        return data; // 正确,常成员函数进行只读操作
    }
    int get_data()
    {
        return data;
    };
};

常成员函数(const member function):类中的成员函数被声明为 const 成员函数后,表示该函数不会修改对象的状态。 在常对象或常引用对象上只能调用常成员函数,而不能调用非常成员函数。

七、总结:

  • 常变量和常引用用于声明不可修改的对象或引用;
  • 常指针,指针指向的值不可被修改;
  • 指针常量,指针本身的值不可被修改;
  • 常对象,整个对象都是常量,其成员变量也是常量,只能调用常成员函数;
  • 常成员函数,表示该函数不会修改对象的成员变量;