【问题标题】:Can I omit const qualifiers in declaration for pointer types?我可以在指针类型的声明中省略 const 限定符吗?
【发布时间】:2011-11-11 21:55:48
【问题描述】:

对于包含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的形参是指针类型,为什么在函数声明中不能省略const?有什么区别?

【问题讨论】:

  • 编译器产生的错误是什么?您评估的微不足道的反例是 int main(int argc, char **argv);
  • 我使用语法int const nint const * ptr 来强调正在发生的事情。 const 直接应用于其左侧的事物,除非它是类型中的第一个单词,在这种情况下,它直接应用于其右侧的事物。当您说const int * ptr 时,这与int const * ptr 相同,当从右到左阅读时是:“ptr 是指向 const int 的指针”。如果你想让指针本身const,你会说int * const ptr。 “ptr 是一个指向 int 的 const 指针”。您可以更改该内存地址的值,但不能更改您指向的地址。

标签: c++ pointers constants


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    const int x 表示x 是只读的inside 函数。外面的世界都不在乎;该函数正在使用参数的副本。

    但是const int *p 意味着p 指向只读的东西。外界确实关心这个;这是一个不能修改指针的承诺。

    由此推论,以下两个声明是等价的:

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

    【讨论】:

      【解决方案3】:

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

      1. int* p
      2. const int* p(或int const* p
      3. const int* const p(或int const* const p

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多