什么是顶级const限定符?

时间:2011-10-27 10:08:23

标签: c++ const

{+ 1}在“顶级”限定符中的含义是什么意思?

还有什么其他级别?

例如:

const

4 个答案:

答案 0 :(得分:54)

顶级const限定符会影响对象本身。其他人只是 与指针和参考相关。他们不做对象 const,并且只阻止使用指针或路径通过路径进行修改 参考。因此:

char x;
char const* p = &x;

这不是顶级const,并且没有任何对象是不可变的。 表达式*p不能用于修改x,而是用于修改其他表达式 可; x不是常量。就此而言

*const_cast<char*>( p ) = 't'

合法且定义明确。

但是

char const x = 't';
char const* p = &x;

这一次,x上有一个顶级常量,因此x是不可变的。没有 表达式允许更改它(即使使用const_cast)。该 编译器可能会将x放入只读内存中,并且它可能会假设 x的值永远不会改变,无论其他代码可能做什么。

要给指针顶级const,你要写:

char x = 't';
char *const p = &x;

在这种情况下,p将永远指向x;任何改变这种情况的企图 是未定义的行为(并且编译器可能将p放在只读内存中, 或者假设*p引用x,无论其他代码如何。)

答案 1 :(得分:12)

int *const iconst置于顶层,而int const *i则不会。{/ p>

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

只要const出现在标识符类型之前或之后,就会被视为顶级限定符。

答案 2 :(得分:6)

给我解释的方式,给出:

[const] TYPE * [const] VARIABLE

VARIABLE 用于指向 TYPE 类型的数据*VARIABLE

*或多个*

中画一条线
  1. 如果const左侧*,则适用于 无法更改数据数据:除初始化外,无法分配*VARIABLE
  2. 如果const正确 *,则适用于 VARIABLE 以及 VARIABLE 指向的内容无法更改:VARIABLE无法分配,初始化时除外
  3. 所以:

              |              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
    

答案 3 :(得分:2)

const的两个级别是: *低级建筑 *顶级律师

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

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

在上面的代码中,有4个不同的指针声明。让我们逐一讲解

int *p普通指针可以用于对基础对象进行更改,并且可以重新分配。

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

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

const int *const cpc(顶层和底层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*

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