C++ const * 和 * const 有什么区别

28 阅读1分钟

C++ const * 和 * const 有什么区别

首先给出答案,const 直接在变量的前面,表示这个变量是一个常量,不能被修改。 const 修饰的是指针变量的话,const * 表示指针指向的值是一个常量,不能被修改。

C++中 指针和其他的变量一样,都是存储数据的变量。

指针变量的值是一个地址,这个地址指向的是内存中的一个位置。

指针是存储地址的变量

需要引出两个概念:顶层const底层 const

  • 顶层const:指针(也可以是普通的变量)本身是一个常量,不能被修改
  • 底层const:指针指向的值是一个常量,不能被修改
int a = 1;
int *const p1 = &a; // 顶层const
const b = 2;
const int *p2 = &b; // 底层const

对于普通的变量,只有顶层const

对于引用来说,引用本身就是一个常量,所以引用只有底层const,没有顶层const(加了会报错)

int a = 1;
int &b = a; 
// int & const b = a; // 报错,'const' qualifiers cannot be applied to 'int&'
const int &c = a; // 底层const

函数的重载

顶层const不能有效重载函数,底层const可以有效重载函数


void func(int a) {

}

void func(const int a) { // 不能重载,报错'void func(int)' previously defined here

}

void func(int *a) { // 类型不同,可以重载

}

void func(int * const a) { // 不能重载

}

void func(const int *a) { // 可以重载

}

对类的成员函数来说:

class A {
public:
  void func() {

  }

  void func() const { // const 修饰的是 this 指针,底层const
    
  }
};

参考链接:

www.dyxmq.cn/program/cod…

【C++11】区分左值、亡值、纯右值,及他们的引用_哔哩哔哩_bilibili