콘 스트 이전 또는 콘 스트 이후? // same as const Object* obj; 중요한 것은

시작하기 위해 아마도 const객체의 데이터 또는 포인터를 수정할 수 없거나 두 가지 모두로 만드는 데 사용될 수 있음을 알고있을 것입니다 .

const Object* obj; // can't change data
Object* const obj; // can't change pointer
const Object* const obj; // can't change data or pointer

그러나 다음 구문을 사용할 수도 있습니다.

Object const *obj; // same as const Object* obj;

중요한 것은 별표에서 const키워드 를 넣는 부분입니다 . 개인적으로 const유형의 왼쪽에 데이터를 수정할 수 없음을 지정하는 것이 좋습니다. 왼쪽에서 오른쪽으로의 사고 방식에서 더 잘 읽히지 만 어떤 구문이 먼저 나왔습니까?

더 중요한 것은 왜 const데이터 를 지정하는 두 가지 올바른 방법이 있으며 어떤 상황에서 어떤 상황에서 하나를 선호하거나 필요합니까?

편집하다:

그래서 컴파일러가 물건을 해석하는 방법에 대한 표준이 내가 태어나 기 오래 전에 작성되었을 때 이것은 임의의 결정이었습니다. 이후 const나는 그들이 추가에 전혀 해를 끼치 없었다 생각 추측 (기본적으로?) 키워드의 왼쪽에 무엇에 적용된다 “바로 가기” 선언에 의해 변경 등의 시간까지 적어도 다른 방법으로 키워드를 입력 한정자를 적용하는가 * 또는 & 구문 분석

이것은 C의 경우에도 마찬가지였습니다.



답변

const데이터 를 지정하는 두 가지 올바른 방법이있는 이유는 무엇이며 어떤 상황에서 선호하는 것이 있습니까?

기본적 const으로 별표 이전의 지정자 내 위치가 중요하지 않은 이유는 C 문법이 Kernighan과 Ritchie에 의해 정의 되었기 때문입니다.

그들이 문법을 이런 식으로 정의한 이유는 C 컴파일러가 왼쪽에서 오른쪽으로 입력을 구문 분석하고 소비했을 때 각 토큰 처리를 완료했기 때문일 수 있습니다. *토큰을 소비하면 현재 선언의 상태가 포인터 유형으로 변경됩니다. 발생 const*수단 const규정 포인터 선언에인가되고; *한정자가 가리키는 데이터에 적용됨을 의미 하기 전에이를 발견했습니다 .

const한정자가 형식 지정자 앞이나 뒤에 나타나면 의미 론적 의미가 변경되지 않기 때문에 어떤 식 으로든 허용됩니다.

함수 포인터를 선언 할 때 비슷한 경우가 발생합니다.

  • void * function1(void)를 반환하는 함수를 선언합니다 void *.

  • void (* function2)(void)를 반환하는 함수에 대한 함수 포인터 를 선언 합니다 void.

다시 한 번 주목할 것은 언어 구문이 왼쪽에서 오른쪽으로 파서를 지원한다는 것입니다.


답변

규칙은 다음과 같습니다.

const는 남은 것에 적용됩니다. 왼쪽에 아무것도 없으면 오른쪽에 적용됩니다.

const가 정의 된 “원래”방식이기 때문에 const 오른쪽에 const를 사용하는 것이 좋습니다.

그러나 저는 이것이 매우 주관적인 관점이라고 생각합니다.


답변

나는 두 번째 구문을 선호합니다. 형식 선언을 오른쪽에서 왼쪽으로 읽어서 ‘무엇이 일정한지’추적하는 데 도움이됩니다.

Object * const obj;        // read right-to-left:  const pointer to Object
Object const * obj;        // read right-to-left:  pointer to const Object
Object const * const obj;  // read right-to-left:  const pointer to const Object

답변

선언에서 키워드의 순서는 모두 고정 된 것은 아닙니다. “하나의 진정한 질서”에 대한 많은 대안이 있습니다. 이렇게

int long const long unsigned volatile i = 0;

아니면

volatile unsigned long long int const i = 0;

??


답변

첫 번째 규칙은 로컬 코딩 표준에 필요한 형식을 사용하는 것입니다. 그 후 : consttypedef가 관련되어있을 때 앞에 배치하면 혼란의 끝이 없습니다.

typedef int* IntPtr;
const IntPtr p1;   // same as int* const p1;

코딩 표준이 typedef의 포인터 포인터를 허용하는 경우 실제로 const를 형식 뒤에 두어야합니다. 모든 경우에 유형에 적용될 때 const는 적용되는 내용을 따라야하므로 일관성은 또한 const에 찬성하여 주장합니다. 그러나 지역 코딩 지침은이 모든 것을 능가합니다. 차이점은 일반적으로 돌아가서 기존 코드를 모두 변경하기에 충분하지 않습니다.


답변

왼쪽 또는 오른쪽이 허용되는 역사적인 이유가 있습니다. Stroustrup은 1983 년까지 C ++에 const를 추가 했지만 C89 / C90까지는 C로 만들지 않았습니다.

C ++에서는 항상 const를 오른쪽에 사용해야하는 좋은 이유가 있습니다. const 멤버 함수 는 다음과 같이 선언 해야 하므로 어디에서나 일관성 이 있습니다.

int getInt() const;