어떻게 const 정확성 변환자가 되었습니까? [닫은]


25

15 년의 C ++ 후에도 여전히 const를 사용하는 것을 배우지 못했습니다. 나는 그것이 사용되는 것을 이해하지만, 실제로 const가 정확 하면 내가 직면 한 문제를 피할 수있는 상황에 처한 적이 없었습니다 .

그래서 const의 장점을 어떻게 사랑하게 되었습니까?


3
const 정확성은 if constrcut 또는 sizeof 연산자와 같은 문제를 해결하는 도구보다 정확하다고 생각합니다.
legends2k

9
"const가 C ++에서 작동하는 이유는 당신이 그것을 캐스트 할 수 있기 때문입니다. 만약 당신이 그것을 캐스트 할 수 없다면, 당신의 세계는 질식 할 것입니다." -Anders Hejlsberg
Mason Wheeler

1
const도 C 유형 수정 자이며 최초의 ANSI C 표준 이후로 사용되었습니다.
Huperniketes

Java / C #에 의해 망쳐 져서, 나는 내가 얻을 기회를 주장하기를 좋아하는 편집증 유형입니다. 잘못 될 수있는 것은 잘못 될 것입니다. 컴파일 타임이나 런타임 지원이 있다면 저를 세어보세요! 나는 3-4 번 그것에 대해 듣 자마자 개종자가 되었고이 링크의 일부를 따라갔습니다 (구문을 볼 수는 있지만 이유에 대해 읽을 필요는 없습니다) : possible.com/Cpp/const.html 아직 내 얼굴에 무언가가 날아 오지 않았기 때문에 ... 정확한 자세를 취하기 위해 약간의 노력이 필요하며 아프지 않습니다. Joel의 생각을 확인하십시오 : joelonsoftware.com/articles/Wrong.html
Job

답변:


28

글쎄, 나는 철학을 받아 들일 때까지 확신하지 못했습니다.

먼저 const가장 기본적인 클래스 멤버와 멤버 함수 인수의 읽기 전용 멤버를 사용하여 시작했습니다 .

거기에서 더 이상 컴파일 할 수 없었습니다. 그런 다음 기본 클래스를 사용하여 코드를 작성하는 데 인내했습니다. 이전에 const추가 한 것이 내가 만든 용도와 비교하여 실제로 합법적 인지 확인하십시오 . 코드의 다른 부분에 constness를 추가하면서 도중에 버그를 수정하는 데 도움이되었습니다.

전염성이 있습니다. 대부분의 코드는 더 많은 일관성을 가지고 있으며 디버깅하지 말아야 할 것을 수정하면 컴파일러가 당신을 멈추게 할 것이기 때문에 디버깅하기가 더 쉽다는 것을 알았습니다.

응용 프로그램을 다시 실행하면 버그가 훨씬 적고 코드를 읽을 때 이해하기 쉽기 때문에 속도가 빨라졌습니다 (발견 한 알고리즘이 작업에 적합하지 않음).

나는 확신했다.

이제는 새로운 코드를 작성하거나 현재 코드를 수정해야 할 때 자신감을 가지기 때문에 constness 외에도 많은 어설 션을 사용할 때 더 낫다고 생각합니다. 필요한 경우 컴파일러가 중지합니다. 이를 통해 수정해서는 안되는 모든 사항을 확인하지 않아도되고 비즈니스 관련 사고 나 건축 사고를위한 사고 시간이 늘어납니다.


8
전염성이있는 +1은 본질적으로 const 변환자가되거나 완전히 피해야 함을 의미합니다.
Martin Wickman

const 정확성이없는 라이브러리에 의존 할 필요도 없습니다. gui 함수는 제한적이지 않기 때문에 gui 함수를 호출 할 수 없거나 모든 gui 호출에서 캐스트해야합니다.
Martin Beckett

4
"디버그하기가 더 쉽다"는 +1, const변경하지 않아도되는 로컬 변수에 대해서도 사용합니다 .이 방법으로 코드를 읽을 때 a if또는 a for또는 다른 것을 훑어 볼 수 있습니다 . 변수는 상수입니다. 변경되지 않는다는 것을 알고 있습니다! 나는 최적화에 대해 덜 신경 쓰지 못했지만 두뇌가 제한되어 있으며 들여 쓰기 수준 + const-correctness가 거의 도움이되지 않습니다!
Matthieu M.

@MatthieuM .: Haskell로 전환을 고려한 적이 있습니까? ;-)
조르지오

@Giorgio : 나는 그것을 탐험했고 심지어 "Real World Haskell"을 구입하기까지 갔다. 솔직히 말해서 나는 기본적으로 게으름과 흥분한 많은 암호 연산자에 감격하지 않습니다.
Matthieu M.

15

나는 결코 객체 지향 프로그래밍을지지 한 적이 없었고, 만약 내가 덜 성장했다면 일반적으로 프로그래밍에 대해 더 많이 배웁니다. 나는 다른 프로그래밍 패러다임을 연구했습니다, 나는 변하지 중 하나입니다 것을 깨달았다 에 따라 작성된 소프트웨어에 영향을 미치는, 프로그램 설계의 중심 개념 어떤 철학을. 간단한 안전 보장 외에도 최적화 및 동시성에 영향을 미치면서 기능 프로그래밍에서 매우 중요합니다.

기본적으로 변경 불가능한 상태에 대한 정당한 이유가없는 한 변경 불가능한 모든 것이 있어야 합니다. 내 경험상 이 목표를 달성하기 위해 모든 언어로 프로그램을 작성 하면 더 안전하고 더 나은 코드로 이어집니다 . const해당되는 곳에서 사용하면 잃을 것이 없습니다. 불변성은 무료입니다!

(실수로, 나는 모든 유형이 const명시 적으로 자격 이 없는 C ++의 방언을 위해 GCC 포크를 만드는 아이디어를 가지고 놀았 mutable습니다.


OO 관점에서, 불변성은 무제한 쓰기 액세스를 방지함으로써 캡슐화를 강제합니다. 불변의 객체는 자신의 상태를 완전히 관리하여 일반적인 값처럼 동작해야하므로 클래스 간의 연결을 줄입니다. Const 정확성은 특히 동시 프로그래밍의 맥락에서 프로그램 정확성을 입증하는 프로세스를 상당히 용이하게합니다. C ++ 참조 및 C ++ 0x rvalue 참조 시맨틱을 사용하면 어디서나 복사하는 오버 헤드에 대해 걱정하지 않고 불변의 객체를 사용할 수 있습니다. 또한 컴파일러는 대부분 불변의 객체로 작업하는 경우 매우 놀라운 최적화 마법을 사용할 수 있습니다.

나는 const모든 곳에서 타이핑하는 것이 짜증나다는 것을 알고 있지만 빠르게 익숙해지며 시간이 지남에 따라 안정성과 유지 관리 측면에서 이점이 분명해집니다. 나는 훌륭한 작가가 아니며, 그것을 입증하는 것은 어려운 작업으로 보이지만, 프로그램을 디자인하고 구현할 때 const 정확성이 개발자에게 큰 도움이되었다는 것을 알고 있습니다. 이와 관련하여 최고의 교사.


2
당신은 기본적으로 const 정확성이 좋은 것이라고 말했다. 당신은 "더 안전하고 더 나은 코드를 이끌어냅니다"라고 말했습니다. 이유를 말할 수 있습니까?
David Reis

저는 불변성 캠프에 있습니다. 가장 좋아하는 언어는 Erlang입니다. 그러나 C ++에서 const를 통한 불변성은 실제로 무료가 아니라고 주장합니다. 읽을 수없는 코드, const 및 non const 버전과 같은 방법의 단점이 있거나 const를 캐스팅하면 "다른 선택은 없었습니다".
grok

1
mutableconst 정확성 측면에서 명확한 의미를 지니고 있기 때문에을 사용 하는 것이 좋습니다. 이는이 데이터 객체가 객체 동작에 영향을 미치지 않는 방식으로 변경 될 수 있으며 캐싱 응답과 같은 것을 허용합니다. 다른 키워드를 만드십시오.
David Thornley

2
@David Thornley : 일관성을 유지하기 mutable위한 논리적 선택입니다. 로컬 변수와 void alter(mutable Point&)마찬가지로 의미 mutable int foo가 있으며 기존 언어와의 충돌이나 기존의 사용과는 다릅니다 mutable. 또한 Object mutable* mutable그것이 필요한지 또는 올바른지에 대한 경고가 될 정도로 무섭게 보입니다.
Jon Purdy

당신이 포크를한다면, 대신 CLang과 함께 갈 것을 고려하십시오-덜 고통 스럽습니다.
gf

6

const 정확성의 장점은 프로그램에 규율을 부과하고 프로그램의 일부에 대해 추론하기가 더 쉽다는 것입니다.

원칙은 무엇인가가 변경 될 수있는 곳을 알아야한다는 것입니다. 이에 상응하는 장점은 상태를 변경하는 내용을 알 수있을 때 코드가 어떤 역할을하는지 더 쉽게 볼 수 있다는 것입니다.


1
"사람들이 읽을 수 있도록, 프로그램은 우연히 기계가 실행되도록 프로그램을 작성해야합니다."
-SICP

4

const 올바르다는 것은 캐스트 연산자를 사용하지 않는 비슷한 문제에 가깝게 다루는 디자인의 정확성을 강조합니다. 따라서 캐스트를 사용하지 않고 구성이 정확하고 변하기 쉬운 최소한의 사용-이 모든 것은 디자인이 얼마나 좋은지를 측정하기위한 포인터 이지만 전체적인 문제를 해결하는 실제 도구 아닙니다.

추신 : 사용 const정확성 을 이해하면 완전히 확신 했습니다.)



2

const-correct code를 작성해야하는 두 가지 주요 이유가 있습니다. 하나는 컴파일러가 당신의 친구이고 const를 사용하여 잠재적 인 버그를 경고하게합니다. 두 번째 이유는 const-correctness가 코드를 더 읽기 쉽게하기 때문입니다. 예를 들어, 어떤 함수 인수가 입력이고 어떤 함수가 출력인지 항상 알고 있습니다. 또한 어떤 멤버 함수가 오브젝트를 수정하고 어떤 멤버 함수가 수정하지 않는지 알고 있습니다. 코드를 읽을 필요없이 이러한 사항을 즉시 알 수 있습니다. 물론 이것은 매우 신중하게 사용한다고 가정합니다 const_cast.


2

나는 그것이 가능하다는 것을 알 자마자 개종했습니다. '좋은 프로그래밍 스타일'관점에서 나에게 의미가 있습니다. const가 올바른 것이 좋은 이유는 여러 가지가 있습니다.

  • 가독성과 이해. 다른 사람의 코드를 읽고 함수가 const 참조를 매개 변수로 사용하면 매개 변수가 읽기 전용 변수로만 사용된다는 것을 알고 있습니다. 코드가 다중 스레드 환경 인 경우 특히 큰 승리입니다.
  • 컴파일러는 const 한정자를 사용하여 최적화 패스를 지원할 수 있습니다.
  • 변경하고 싶지 않은 상황에서 클래스 A의 객체가 있다고 가정 해보십시오. 그런 다음 해당 객체에 대해 호출 할 수있는 유일한 멤버 함수는 const 인 함수입니다.

2

다른 답변에서 다룬 두 가지 요점을 요약하고 새 요점을 추가하려면 다음을 수행하십시오.

  • constAPI 사용자에게 코드를 문서화합니다. 함수와 호출자 사이에 계약을 구성하여 함수가 매개 변수를 수정하지 않습니다. ( const_cast함수는 매개 변수를 변경할 수 없으며 매개 변수를 수정하지 않고 const주석을 잊어 버린 다른 함수에 해당 매개 변수를 전달할 수 있습니다 .) 또한 함수 / 루프 등에서 유용합니다. 루프 불변과 같은 방식으로.

  • const컴파일러에 대한 의도를 문서화하십시오. 컴파일 타임에 실수를 찾는 것이 항상 해당 코드가 실행되기를 기다리는 것보다 낫습니다.

  • const안전한 유형 다형성에 필요합니다. 포인터 (원시 포인터가 아닌 모든 형태의 포인터)는 해당되는 경우에만 공변량입니다 const(주 : "포인터에 대한 포인터"와 동일하지 않음). 공분산에는 읽기 전용 인터페이스가 필요하고, 공분산에는 쓰기 전용 인터페이스가 필요합니다.

이 중 두 번째는 먼저 배웠습니다. 나는 시작 const나는 등, 이전 오류를 잡기 및 지역 주민에 그것을 사용하는 시작의 혜택을보기 시작 전까지 만 포인터와 참조 매개 변수의 대상

그런 다음 대부분 #define의 s를 유형 안전의 이점을 추가하여 전역 상수로 대체 할 수 있음을 배웠습니다 (C ++에서). 그래서 나는 거기에서도 사용했습니다.

마지막으로 나는 타입 시스템과 람다 미적분학 수업을 들었고 constconst유형이 근본적으로 다르다는 것을 배웠습니다 (다른 연산을 지원하기 때문에) const.


1

다른 사람들이 언급하지 않은 것의 5 센트가 있습니다. 변수를 전달할 때 추가 구성과 파괴 및 복사본을 피하기 위해 실제로 필요한 경우가 아니라면 값으로 전달하고 싶지 않습니다. 따라서 실제로 값으로 전달하지 않는 한 어디에서나 참조를 사용하면 전달 된 값을 변경하지 않아도 성능이 크게 향상됩니다. 이러한 이유로 모든 인수를 참조하는 함수가있는 경우 호출자에게 함수가 수정하지 않을 내용을 알려 주어야합니다.

같은 원칙이지만 const를 사용하는 실용적인 이유를 추가하고 싶었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.