'const int'与'int const'在C++和C++中作为函数参数的对比。

问题描述 投票:114回答:9

考虑一下。

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

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

这两个函数在各方面都是一样的吗 还是有区别?

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

c++ c const
9个回答
174
投票

const TT const 是相同的。对于指针类型,它变得更加复杂。

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

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

这就是为什么很多人喜欢总是把 const 到类型的右边("东方常量 "风格):这使得它相对于类型的位置是一致的,而且容易记忆(据传闻,这似乎也使得初学者更容易学习)。


338
投票

诀窍是把声明倒过来读(从右到左)。

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

14
投票

两者没有区别。 它们都声明 "a "是一个不能改变的整数。

区别开始出现的地方是当你使用指针的时候。

这两种情况。

const int *a
int const *a

都声明 "a "是一个指向一个不会改变的整数的指针. "a "可以被赋值,但 "*a "不能。

int * const a

声明 "a "是一个指向整数的常量指针。 "*a "可以被赋值给,但 "a "不能。

const int * const a

声明 "a "是一个常数指针,指向一个常数整数,"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;
}

7
投票

Prakash 是正确的,这两个声明是一样的,尽管对指针的情况可能需要多一点解释。

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

参见 https:/isocpp.orgwikifaqconst-correctness#const-ptr-vs-ptr-const。.


5
投票

const intint const一般来说,将一个标量函数参数声明为 const 是不需要的,因为C语言的逐值调用语义意味着对变量的任何改变都是在其包围函数的局部。


4
投票

这不是一个直接的答案,而是一个相关的提示。 为了让事情变得简单,我总是使用对流的 "put 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

4
投票

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

int getInt() const;

它改变了 this 函数中的指针 Foo * constFoo const * const. 看这里


3
投票

是的,他们是一样的,只是 int

而不同 int*


3
投票

我认为在这种情况下,它们是一样的,但这里有一个例子,顺序很重要。

const int* cantChangeTheData;
int* const cantChangeTheAddress;
© www.soinside.com 2019 - 2024. All rights reserved.