我可以在声明中省略指针类型的const限定符吗?

时间:2011-11-11 21:55:48

标签: c++ pointers const

对于包含类型void foo(const int )的声明的函数定义,以下两个声明都是有效的。

void foo(const int); // valid
void foo(int); // valid, const can be omitted.

但是如果函数定义包含void foo(const int*)类型的声明,则省略const是非法的:

void foo(const int *); // valid declaration
void foo(int *); // error: const cannot be omitted.

如果函数声明的参数有指针类型,为什么const不能省略?有什么区别?

3 个答案:

答案 0 :(得分:3)

const int x表示x在函数内是只读。外界不关心任何一种方式;该函数正在使用参数的副本。

但是const int *p表示p指向只读的内容。外面的世界 关心这个;它是一个承诺,无法修改指针。

这样做的必然结果是以下两个声明是等效的:

void foo(const int *);
void foo(const int * const);

答案 1 :(得分:3)

只有将直接应用于参数时,才能省略const说明符。在指针的情况下,它应用于指向的东西,而不是指针本身,因此const和参数之间有一个额外的间接级别。在这种情况下你可以省略它:

void foo(int* const);
void foo(int*);

答案 2 :(得分:2)

函数处理传递的参数的副本。如果是整数,则可以省略const,因为原始不会被触及。如果指向int类型的指针有三个选项:

  1. int* p
  2. const int* p(或int const* p
  3. const int* const p(或int const* const p
  4. const可以应用于指向对象,指针本身或两者。作为参数传递的是指针,因此当它的副本传递给函数时,可以省略const。所以(2)和(3)可以互换使用(仅当用作函数参数类型时!)。但是对于指向对象类型的const有所不同:

    • void foo(const int* p); //函数无法通过p
    • 修改指向的整数对象
    • void foo(int* p); //函数可以通过p
    • 修改指向的整数对象

    在这两种情况下,函数都可以修改函数内的p,但这些更改不会反映在原始指针的值上。