125

考虑:

int testfunc1 (const int a)
{
  return a;
}

int testfunc2 (int const a)
{
  return a;
}

这两个功能是在各个方面都相同还是有区别?

我对 C 语言的答案很感兴趣,但如果 C++ 语言中有什么有趣的东西,我也想知道。

4

9 回答 9

351

诀窍是向后阅读声明(从右到左):

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
于 2008-10-02T14:32:57.663 回答
189

const T并且T const是相同的。使用指针类型变得更加复杂:

  1. const char*是一个指向常量的指针char
  2. char const*是一个指向常量的指针char
  3. char* const是一个指向(可变)的常量指针char

换句话说,(1)和(2)是相同的。制作指针(而不是被指针)的唯一方法const是使用后缀- const

这就是为什么许多人更喜欢总是放在const类型的右侧(“East const”样式):它使得它相对于类型的位置一致且易于记忆(有趣的是,它似乎也更容易教给初学者)。

于 2008-10-02T14:14:57.317 回答
13

没有区别。他们都声明“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;
}
于 2008-10-02T14:28:33.743 回答
8

Prakash 是正确的,声明是相同的,尽管可能需要对指针大小写进行更多解释。

"const int* p" 是一个指向 int 的指针,它不允许通过该指针更改 int。"int* const p" 是一个指向 int 的指针,不能更改为指向另一个 int。

请参阅https://isocpp.org/wiki/faq/const-correctness#const-ptr-vs-ptr-const

于 2008-10-02T14:18:18.680 回答
6

const int与 相同,对于 C 中的所有标量类型都是如此。通常,不需要int const将标量函数参数声明为,因为 C 的按值调用语义意味着对变量的任何更改都是其封闭函数的局部变量。const

于 2008-11-05T18:11:43.733 回答
6

它们是相同的,但在 C++ 中,始终在右侧使用 const 是有充分理由的。您将在任何地方保持一致,因为必须以这种方式声明 const 成员函数:

int getInt() const;

它将this函数中的指针从更改Foo * constFoo const * const看这里。

于 2015-09-22T22:16:23.067 回答
4

是的,它们只是相同的int

和不同的int*

于 2008-10-02T14:13:36.557 回答
4

这不是直接答案,而是相关提示。为了保持直截了当,我总是使用对流“放在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
于 2008-10-02T15:20:18.453 回答
3

我认为在这种情况下它们是相同的,但这是一个顺序很重要的示例:

const int* cantChangeTheData;
int* const cantChangeTheAddress;
于 2008-10-02T14:15:02.200 回答