快速提问:
int testfunc1 (const int a) { return a; } int testfunc2 (int const a) { return a; }
这两个功能在每个方面都是相同的还是有区别的?我对C语言的答案感兴趣,但如果C++语言中有一些有趣的东西,我也想知道.
诀窍是向后阅读声明(从右到左):
const int a = 1; // read as "a is an integer which is constant" int const a = 1; // read as "a is a constant integer"
两者都是一回事.因此:
a = 2; // Can't do because a is constant
当您处理更复杂的声明时,阅读向后技巧尤其会派上用场,例如:
const char *s; // read as "s is a pointer to a char that is constant" char c; char *const t = &c; // read as "t is a constant pointer to a char" *s = 'A'; // Can't do because the char is constant s++; // Can do because the pointer isn't constant *t = 'A'; // Can do because the char isn't constant t++; // Can't do because the pointer is constant
const T
并且T const
完全相同.使用指针类型会变得更复杂:
const char*
是一个指向常量的指针 char
char const*
是一个指向常量的指针 char
char* const
是一个指向(可变)的常量指针 char
换句话说,(1)和(2)是相同的.制作指针(而不是指针)的唯一方法const
是使用后缀 - const
.
这就是为什么许多人更喜欢总是放在const
类型的右侧("东方const"风格):它使其位置相对于类型一致且易于记忆(它也传闻似乎更容易教给初学者).
没有区别.它们都声明"a"是一个无法更改的整数.
差异开始出现的地方是使用指针时.
这两个:
const int *a int const *a
声明"a"是指向不改变的整数的指针."a"可以分配给,但"*a"不能分配.
int * const a
声明"a"是一个指向整数的常量指针."*a"可以分配给,但"a"不能分配.
const int * const a
将"a"声明为常量整数的常量指针."a"和"*a"都不能分配给.
static int one = 1; int testfunc3 (const int *a) { *a = 1; /* Error */ a = &one; return *a; } int testfunc4 (int * const a) { *a = 1; a = &one; /* Error */ return *a; } int testfunc5 (const int * const a) { *a = 1; /* Error */ a = &one; /* Error */ return *a; }
Prakash是正确的,声明是相同的,虽然指针案例的更多解释可能是有序的.
"const int*p"是指向int的指针,该int不允许通过该指针更改int."int*const p"是指向无法更改为指向另一个int的int的指针.
请参阅http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.5.
const int
与int const
C中的所有标量类型都是一样的.通常,const
不需要声明标量函数参数,因为C的值调用语义意味着对变量的任何更改都是其封闭函数的局部变量.