‘ const int’与‘ int const’作为 C + + 和 C 中的函数参数

考虑一下:

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


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

这两个函数在各个方面是相同的还是有区别?

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

110234 次浏览

是的,它们对于 int来说是一样的

int*不同

const TT const是相同的。使用指针类型会变得更加复杂:

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

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

这就是为什么许多人喜欢总是把 const放在字体的右边(“ East const”风格) : 它使它的位置相对于字体的一致性和容易记住(它也有趣地似乎使它更容易教给初学者)。

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

const int* cantChangeTheData;
int* const cantChangeTheAddress;

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

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

参见 https://isocpp.org/wiki/faq/const-correctness#const-ptr-vs-ptr-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;
}

诀窍是反向读取声明(从右向左) :

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 intint const相同,C 中的所有标量类型也是如此。通常,不需要将标量函数参数声明为 const,因为 C 的按值调用语义意味着对变量的任何更改都是对其封闭函数的本地更改。

它们是一样的,但是在 C + + 中有一个很好的理由总是在右边使用 const。在任何地方都是一致的,因为 const 成员函数 必须的是这样声明的:

int getInt() const;

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