C++ 및 C에서 함수 매개 변수로 'const int' 대 'int const'
고려 사항:
int testfunc1 (const int a)
{
return a;
}
int testfunc2 (int const a)
{
return a;
}
이 두 기능이 모든 면에서 동일한가, 아니면 차이가 있는가?
C언어에 대한 답변에 관심이 있지만 C++언어에 재미있는 것이 있다면 나도 알고 싶다.
요령은 선언문을 거꾸로 읽는 것이다(오른쪽부터 왼쪽까지).
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 T
그리고T const
동일하다.포인터 유형을 사용하면 더욱 복잡해진다.
const char*
상수에 대한 포인터임char
char const*
상수에 대한 포인터임char
char* const
(수동 가능)에 대한 상수 포인터임char
즉 (1)과 (2)는 동일하다.포인터를 만드는 유일한 방법(피니티 대신)const
접미사를 사용하는 것const
.
이것이 많은 사람들이 항상 말하길 선호하는 이유다.const
타입의 우측("East constitute" 스타일): 타입에 상대적인 위치를 일관성 있고 기억하기 쉽게 만든다(일화로도 초보자에게 쉽게 가르칠 수 있는 것 같다).
그들은 똑같지만, C++에서는 항상 오른쪽의 const를 사용해야 하는 충분한 이유가 있다.항상 멤버 기능은 다음과 같이 선언되어야 하기 때문에 어디에서나 일관성이 있을 것이다.
int getInt() const;
그것은 변한다.this
에서 함수를 가리키다.Foo * const
로Foo const * const
.여기를 보라구.
포인터 케이스에 대한 설명이 조금 더 있을 수도 있지만 선언문은 같다는 프라카시가 옳다.
"const int* p"는 해당 포인터를 통해 int가 변경되지 않는 int에 대한 포인터다."int* const p"는 다른 int를 가리키도록 변경할 수 없는 int에 대한 포인터다.
https://isocpp.org/wiki/faq/const-correctness#const-ptr-vs-ptr-const을 참조하십시오.
const int
와 동일하다int const
C에 있는 모든 스칼라 유형에 해당하는 경우.일반적으로 스칼라 함수 파라미터를 다음과 같이 선언한다.const
C의 가치별 의미론(call-by-value semantics)은 변수에 대한 어떤 변경도 해당 변수의 포함 함수에 로컬이라는 것을 의미하기 때문에 필요하지 않다.
응, 그냥 똑같아.int
에 있어서 다르다.int*
차이가 없다.그들은 둘 다 "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;
}
이것은 직접적인 대답이 아니라 관련 팁이다.일을 똑바로 하기 위해 나는 항상 대류 "put"을 사용한다.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* cantChangeTheData;
int* const cantChangeTheAddress;
참조URL: https://stackoverflow.com/questions/162480/const-int-vs-int-const-as-function-parameters-in-c-and-c
'Programing' 카테고리의 다른 글
정의되지 않은 VUEX의 '커밋' 속성을 읽을 수 없음 (0) | 2022.05.08 |
---|---|
언제 부울의 null 값을 사용해야 하는가? (0) | 2022.05.08 |
Java로 UTF-8 파일을 작성하는 방법? (0) | 2022.05.08 |
중단점 목록을 저장하도록 GDB 가져오기 (0) | 2022.05.08 |
라디오 그룹 Vuetify 중앙 집중화 (0) | 2022.05.07 |