const int与int const作为C ++和C中的函数参数
快速提问:
int testfunc1 (const int a) { return a; } int testfunc2 (int const a) { return a; }
这两个功能在各个方面都是相同的还是有所不同?我对C语言的答案很感兴趣,但是如果C ++语言中有一些有趣的东西,我也想知道。
解决方案
是的,它们只是在int
中是相同的
与int *
不同
" const T"和" T const"是相同的。使用指针类型会变得更加复杂:
- const char *是指向常量char的指针
- char const *是指向常量char的指针
- char * const是指向(可变)char的常量指针。
换句话说,(1)和(2)是相同的。制作指针(而不是指针)const的唯一方法是使用后缀const。
这就是为什么许多人总是将const放在类型的右侧(东部const样式)的原因:它使相对于类型的位置保持一致,并且易于记忆(从轶事上看,它也更易于教授初学者)。
我认为在这种情况下它们是相同的,但是这是一个顺序很重要的示例:
const int* cantChangeTheData; int* const cantChangeTheAddress;
Prakash是正确的,声明是相同的,尽管可能会按顺序对指针的情况进行一些解释。
" const int * p"是指向不允许通过该指针更改int的int的指针。 " int * const p"是一个指向int的指针,该指针不能更改为指向另一个int。
请参阅http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.5.
没有区别。它们都将" a"声明为不可更改的整数。
当使用指针时,开始出现差异的地方。
这两个:
const int *a int const *a
声明" a"为指向不变的整数的指针。可以将" a"分配给,但是不能将" * a"分配给。
int * const a
声明" a"为指向整数的常量指针。可以将" * 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; }
诀窍是向后(从右到左)读取声明:
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",其中"外部"是指最左边或者最右边。这样就不会造成混淆-const适用于最接近的东西(类型或者*
)。例如。,
int * const foo = ...; // Pointer cannot change, pointed to value can change const int * bar = ...; // Pointer can change, pointed to value cannot change int * baz = ...; // Pointer can change, pointed to value can change const int * const qux = ...; // Pointer cannot change, pointed to value cannot change
const int与int const相同,对于C中的所有标量类型都是如此。通常,不需要将标量函数参数声明为const,因为C的按值调用语义意味着任何更改变量的位置是其封闭函数的局部变量。