const不同位置的区别

在C++中,const关键字的位置相对于类型和星号(*,用于指针)或者引用符号(&)会影响它修饰的内容。这些不同的位置可以表示不同的含义,例如指针常量、常量指针、常量引用等。以下是const位置对含义的影响:

1. 指针和const

  • const在类型前:

    1
    const int* ptr;

    这意味着ptr是一个指向const int的指针。你不能通过这个指针修改它指向的值,但是你可以修改指针ptr本身,使它指向另一个地址。

  • const在星号后:

    1
    int* const ptr = &someIntVar;

    这意味着ptr是一个指向int的常量指针。你可以修改指针所指向的值,但是不能修改指针ptr本身的值,即不能让它指向另一个地址。这里,指针必须在声明时初始化,并且之后不能再指向其他地址。

  • const同时在类型前和星号后:

    1
    const int* const ptr = &someIntVar;

    ptr是一个指向const int的常量指针。既不能通过指针修改所指向的值,也不能修改指针本身的值。

2. 引用和const

  • 引用总是“常量”的,因为一旦它们被初始化后就不能再改变所引用的对象。但是,引用可以是对常量的引用,这意味着通过引用不能修改它所绑定的对象。

    1
    const int& ref = someIntVar;

这意味着ref是对const int的引用,一旦绑定,你不能通过ref来修改所引用的值。但是原始变量如果不是const的话,仍然可以直接修改。

3. 类成员函数和const

  • const在成员函数参数列表后:

    1
    int getValue() const;

这意味着 getValue是一个常量成员函数,这种函数不能修改调用它的对象的任何非静态成员。

总结

  • const在类型前:修饰的是类型,意味着你不能通过指针或引用修改所指向或引用的值。
  • const在指针声明中星号后:修饰的是指针本身,意味着指针不能指向其他地方,但指针指向的值可以修改。
  • const在成员函数后:修饰的是这个成员函数,在这个成员函数中,不能修改任何成员变量(除非它们被声明为mutable)。

const的正确使用能够提高程序的健壮性,防止代码中不小心修改不该修改的数据,增强程序的可读性和可维护性。