什么是顶级const限定符?

use*_*214 46 c++ const

是什么const在"顶级"预选赛中,C平均++?

还有什么其他水平?

例如:

int const *i;
int *const i;
int const *const i;
Run Code Online (Sandbox Code Playgroud)

Jam*_*nze 56

顶级const限定符会影响对象本身.其他只与指针和引用相关.它们不会使对象成为常量,并且仅阻止使用指针或引用通过路径进行修改.从而:

char x;
char const* p = &x;
Run Code Online (Sandbox Code Playgroud)

这不是顶级const,并且没有对象是不可变的.表达式*p不能用于修改x,但其他表达式可以; x不是常数.对于这个问题

*const_cast<char*>( p ) = 't'
Run Code Online (Sandbox Code Playgroud)

是合法的,定义明确.

char const x = 't';
char const* p = &x;
Run Code Online (Sandbox Code Playgroud)

这次,有一个顶级const x,所以x是不可变的.不允许表达式更改它(即使const_cast使用).编译器可以放入x只读存储器,并且可以假设x永不改变的值,而不管其他代码可能做什么.

要将指针指向顶级const,您需要写:

char x = 't';
char *const p = &x;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,p将指向x永远; 任何改变它的尝试都是未定义的行为(并且编译器可能放入p只读内存,或者假设*p引用x,不管其他任何代码如何).

  • 另一点:在编写函数时,参数的顶级限定符将被丢弃.这意味着`void foo(char const)`和`void foo(char)`是相同的函数(实际上它们可以互换).理由是,由于参数是通过复制进行的,因此调用者不关心是否可以修改副本,因此对她来说是透明的. (8认同)
  • @MatthieuM.好点,虽然不完全如上所述.顶级限定符在声明中以及函数类型中被忽略.然而,在定义中,它们仍然在函数内表现得像往常一样.(顶级限定符也被`typeid`和模板参数忽略,当匹配异常捕获时,可能在其他一些我忘记的情况下.实际上,它们对非类类型的返回值也没有影响.) (8认同)

Bla*_*iev 12

int *const i置于const顶层,而int const *i不是.

第一个说指针i本身是不可变的,而第二个指的是指针指向的内存是不可变的.

每当const出现在标识符类型之前或之后,就被认为是顶级限定符.


小智 10

const 的两个级别是: * 低级 Const * 顶级 Const

您应该通过引用和指针查看顶层和底层 const,因为这是它们相关的地方。

int i = 0;
int *p = &i;
int *const cp = &i;
const int *pc = &i;
const int *const cpc = &i;
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,有 4 种不同的指针声明。让我们逐一分析,

int *p: Normal Pointer可用于对底层对象进行更改,并可重新分配。

int *const cp(顶级常量):常量指针可用于对底层对象进行更改,但不能重新分配。(不能将其更改为指向另一个对象。)

const int *pc(低级 const):指向 Const 的指针不能用于对底层对象进行更改,但本身可以重新分配。

const int *const cpc(顶级和低级 const):Const 指向 Const 的指针既不能用于对底层对象进行更改,也不能对其本身进行重新分配。

此外,当分配给另一个对象时,始终忽略顶级 const,而不会忽略低级 const。

int i = 0;
const int *pc = &i;
int *const cp = &i;

int *p1 = cp; // allowed
int *p2 = pc; // error, pc has type const int*
Run Code Online (Sandbox Code Playgroud)

希望这有帮助:) 仅供参考:C++ Primer 有很多关于相同的信息!!!


Gle*_*aum 8

给我解释的方式,给出:

[const] TYPE * [const] VARIABLE
Run Code Online (Sandbox Code Playgroud)

VARIABLE被用于指向数据类型的类型通过*VARIABLE

*或多个*s中画一条线

  1. 如果有一个const左侧的的*它适用于 数据数据无法更改:*VARIABLE无法分配,除了在初始化
  2. 如果有一个const右边的的*它适用于 可变,什么变量,以不能改变要点:VARIABLE不能分配,除了在初始化

所以:

          |              left  right
int       *       i1;
          |              no    no     can change *i1 and i1

int const *       i2;     
          |              yes   no     cannot change *i2 but can change i2

int       * const i3;
          |              no    yes    can change *i3 but i3 cannot be changed

int const * const i4;
          |              yes   yes    cannot change *i4 or i4
Run Code Online (Sandbox Code Playgroud)

  • `const` 绑定到左边。除非左边没有任何东西,否则它会绑定到右边 (3认同)