对于包含类型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
不能省略?有什么区别?
答案 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类型的指针有三个选项:
int* p
const int* p
(或int const* p
)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
,但这些更改不会反映在原始指针的值上。