program story

const int vs. int const C ++ 및 C의 함수 매개 변수

inputbox 2020. 7. 29. 08:12
반응형

const int vs. int const C ++ 및 C의 함수 매개 변수


빠른 질문:

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

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

이 두 기능이 모든 측면에서 동일합니까 아니면 차이가 있습니까? C 언어에 대한 답변에 관심이 있지만 C ++ 언어에 흥미로운 것이 있으면 알고 싶습니다.


const TT const동일하다. 포인터 유형을 사용하면 더 복잡해집니다.

  1. const char* 상수에 대한 포인터입니다 char
  2. char const* 상수에 대한 포인터입니다 char
  3. char* const (mutable)에 대한 상수 포인터 char

즉, (1)과 (2)는 동일하다. 포인터가 아닌 포인터를 만드는 유일한 방법은 접미사 const를 사용하는 것 const입니다.

이것이 많은 사람들이 항상 const유형의 오른쪽에 배치하는 것을 선호하는 이유 ( "동부 const"스타일) : 유형에 대한 위치를 일관되고 기억하기 쉽도록 만듭니다 (비례 적으로 초보자에게 쉽게 가르치는 것처럼 보입니다) ).


요령은 선언을 거꾸로 읽는 것입니다 (오른쪽에서 왼쪽으로).

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

다른 점이 없다. 둘 다 "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 * const p"는 다른 int를 가리 키도록 변경할 수없는 int에 대한 포인터입니다.

http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.5를 참조 하십시오 .


const int is identical to int const, as is true with all scalar types in C. In general, declaring a scalar function parameter as const is not needed, since C's call-by-value semantics mean that any changes to the variable are local to its enclosing function.


This isn't a direct answer but a related tip. To keep things straight, I always use the convection "put const on the outside", where by "outside" I mean the far left or far right. That way there is no confusion -- the const applies to the closest thing (either the type or the *). E.g.,



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

They are the same, but in C++ there's a good reason to always use const on the right. You'll be consistent everywhere because const member functions must be declared this way:

int getInt() const;

It changes the this pointer in the function from Foo * const to Foo const * const. See here.


Yes, they are same for just int

and different for int*


I think in this case they are the same, but here is an example where order matters:

const int* cantChangeTheData;
int* const cantChangeTheAddress;

참고URL : https://stackoverflow.com/questions/162480/const-int-vs-int-const-as-function-parameter-in-c-and-c

반응형