15 년의 C ++ 후에도 여전히 const를 사용하는 것을 배우지 못했습니다. 나는 그것이 사용되는 것을 이해하지만, 실제로 const가 정확 하면 내가 직면 한 문제를 피할 수있는 상황에 처한 적이 없었습니다 .
그래서 const의 장점을 어떻게 사랑하게 되었습니까?
15 년의 C ++ 후에도 여전히 const를 사용하는 것을 배우지 못했습니다. 나는 그것이 사용되는 것을 이해하지만, 실제로 const가 정확 하면 내가 직면 한 문제를 피할 수있는 상황에 처한 적이 없었습니다 .
그래서 const의 장점을 어떻게 사랑하게 되었습니까?
답변:
글쎄, 나는 철학을 받아 들일 때까지 확신하지 못했습니다.
먼저 const
가장 기본적인 클래스 멤버와 멤버 함수 인수의 읽기 전용 멤버를 사용하여 시작했습니다 .
거기에서 더 이상 컴파일 할 수 없었습니다. 그런 다음 기본 클래스를 사용하여 코드를 작성하는 데 인내했습니다. 이전에 const
추가 한 것이 내가 만든 용도와 비교하여 실제로 합법적 인지 확인하십시오 . 코드의 다른 부분에 constness를 추가하면서 도중에 버그를 수정하는 데 도움이되었습니다.
전염성이 있습니다. 대부분의 코드는 더 많은 일관성을 가지고 있으며 디버깅하지 말아야 할 것을 수정하면 컴파일러가 당신을 멈추게 할 것이기 때문에 디버깅하기가 더 쉽다는 것을 알았습니다.
응용 프로그램을 다시 실행하면 버그가 훨씬 적고 코드를 읽을 때 이해하기 쉽기 때문에 속도가 빨라졌습니다 (발견 한 알고리즘이 작업에 적합하지 않음).
나는 확신했다.
이제는 새로운 코드를 작성하거나 현재 코드를 수정해야 할 때 자신감을 가지기 때문에 constness 외에도 많은 어설 션을 사용할 때 더 낫다고 생각합니다. 필요한 경우 컴파일러가 중지합니다. 이를 통해 수정해서는 안되는 모든 사항을 확인하지 않아도되고 비즈니스 관련 사고 나 건축 사고를위한 사고 시간이 늘어납니다.
const
변경하지 않아도되는 로컬 변수에 대해서도 사용합니다 .이 방법으로 코드를 읽을 때 a if
또는 a for
또는 다른 것을 훑어 볼 수 있습니다 . 변수는 상수입니다. 변경되지 않는다는 것을 알고 있습니다! 나는 최적화에 대해 덜 신경 쓰지 못했지만 두뇌가 제한되어 있으며 들여 쓰기 수준 + const-correctness가 거의 도움이되지 않습니다!
나는 결코 객체 지향 프로그래밍을지지 한 적이 없었고, 만약 내가 덜 성장했다면 일반적으로 프로그래밍에 대해 더 많이 배웁니다. 나는 다른 프로그래밍 패러다임을 연구했습니다, 나는 변하지 중 하나입니다 것을 깨달았다 에 따라 작성된 소프트웨어에 영향을 미치는, 프로그램 설계의 중심 개념 어떤 철학을. 간단한 안전 보장 외에도 최적화 및 동시성에 영향을 미치면서 기능 프로그래밍에서 매우 중요합니다.
기본적으로 변경 불가능한 상태에 대한 정당한 이유가없는 한 변경 불가능한 모든 것이 있어야 합니다. 내 경험상 이 목표를 달성하기 위해 모든 언어로 프로그램을 작성 하면 더 안전하고 더 나은 코드로 이어집니다 . const
해당되는 곳에서 사용하면 잃을 것이 없습니다. 불변성은 무료입니다!
(실수로, 나는 모든 유형이 const
명시 적으로 자격 이 없는 C ++의 방언을 위해 GCC 포크를 만드는 아이디어를 가지고 놀았 mutable
습니다.
OO 관점에서, 불변성은 무제한 쓰기 액세스를 방지함으로써 캡슐화를 강제합니다. 불변의 객체는 자신의 상태를 완전히 관리하여 일반적인 값처럼 동작해야하므로 클래스 간의 연결을 줄입니다. Const 정확성은 특히 동시 프로그래밍의 맥락에서 프로그램 정확성을 입증하는 프로세스를 상당히 용이하게합니다. C ++ 참조 및 C ++ 0x rvalue 참조 시맨틱을 사용하면 어디서나 복사하는 오버 헤드에 대해 걱정하지 않고 불변의 객체를 사용할 수 있습니다. 또한 컴파일러는 대부분 불변의 객체로 작업하는 경우 매우 놀라운 최적화 마법을 사용할 수 있습니다.
나는 const
모든 곳에서 타이핑하는 것이 짜증나다는 것을 알고 있지만 빠르게 익숙해지며 시간이 지남에 따라 안정성과 유지 관리 측면에서 이점이 분명해집니다. 나는 훌륭한 작가가 아니며, 그것을 입증하는 것은 어려운 작업으로 보이지만, 프로그램을 디자인하고 구현할 때 const 정확성이 개발자에게 큰 도움이되었다는 것을 알고 있습니다. 이와 관련하여 최고의 교사.
mutable
const 정확성 측면에서 명확한 의미를 지니고 있기 때문에을 사용 하는 것이 좋습니다. 이는이 데이터 객체가 객체 동작에 영향을 미치지 않는 방식으로 변경 될 수 있으며 캐싱 응답과 같은 것을 허용합니다. 다른 키워드를 만드십시오.
mutable
위한 논리적 선택입니다. 로컬 변수와 void alter(mutable Point&)
마찬가지로 의미 mutable int foo
가 있으며 기존 언어와의 충돌이나 기존의 사용과는 다릅니다 mutable
. 또한 Object mutable* mutable
그것이 필요한지 또는 올바른지에 대한 경고가 될 정도로 무섭게 보입니다.
const 올바르다는 것은 캐스트 연산자를 사용하지 않는 비슷한 문제에 가깝게 다루는 디자인의 정확성을 강조합니다. 따라서 캐스트를 사용하지 않고 구성이 정확하고 변하기 쉬운 최소한의 사용-이 모든 것은 디자인이 얼마나 좋은지를 측정하기위한 포인터 이지만 전체적인 문제를 해결하는 실제 도구 는 아닙니다.
추신 : 사용 const
의 정확성 을 이해하면 완전히 확신 했습니다.)
const-correct code를 작성해야하는 두 가지 주요 이유가 있습니다. 하나는 컴파일러가 당신의 친구이고 const를 사용하여 잠재적 인 버그를 경고하게합니다. 두 번째 이유는 const-correctness가 코드를 더 읽기 쉽게하기 때문입니다. 예를 들어, 어떤 함수 인수가 입력이고 어떤 함수가 출력인지 항상 알고 있습니다. 또한 어떤 멤버 함수가 오브젝트를 수정하고 어떤 멤버 함수가 수정하지 않는지 알고 있습니다. 코드를 읽을 필요없이 이러한 사항을 즉시 알 수 있습니다. 물론 이것은 매우 신중하게 사용한다고 가정합니다 const_cast
.
나는 그것이 가능하다는 것을 알 자마자 개종했습니다. '좋은 프로그래밍 스타일'관점에서 나에게 의미가 있습니다. const가 올바른 것이 좋은 이유는 여러 가지가 있습니다.
다른 답변에서 다룬 두 가지 요점을 요약하고 새 요점을 추가하려면 다음을 수행하십시오.
const
API 사용자에게 코드를 문서화합니다. 함수와 호출자 사이에 계약을 구성하여 함수가 매개 변수를 수정하지 않습니다. ( const_cast
함수는 매개 변수를 변경할 수 없으며 매개 변수를 수정하지 않고 const
주석을 잊어 버린 다른 함수에 해당 매개 변수를 전달할 수 있습니다 .) 또한 함수 / 루프 등에서 유용합니다. 루프 불변과 같은 방식으로.
const
컴파일러에 대한 의도를 문서화하십시오. 컴파일 타임에 실수를 찾는 것이 항상 해당 코드가 실행되기를 기다리는 것보다 낫습니다.
const
안전한 유형 다형성에 필요합니다. 포인터 (원시 포인터가 아닌 모든 형태의 포인터)는 해당되는 경우에만 공변량입니다 const
(주 : "포인터에 대한 포인터"와 동일하지 않음). 공분산에는 읽기 전용 인터페이스가 필요하고, 공분산에는 쓰기 전용 인터페이스가 필요합니다.
이 중 두 번째는 먼저 배웠습니다. 나는 시작 const
나는 등, 이전 오류를 잡기 및 지역 주민에 그것을 사용하는 시작의 혜택을보기 시작 전까지 만 포인터와 참조 매개 변수의 대상
그런 다음 대부분 #define
의 s를 유형 안전의 이점을 추가하여 전역 상수로 대체 할 수 있음을 배웠습니다 (C ++에서). 그래서 나는 거기에서도 사용했습니다.
마지막으로 나는 타입 시스템과 람다 미적분학 수업을 들었고 const
비 const
유형이 근본적으로 다르다는 것을 배웠습니다 (다른 연산을 지원하기 때문에) const
.
다른 사람들이 언급하지 않은 것의 5 센트가 있습니다. 변수를 전달할 때 추가 구성과 파괴 및 복사본을 피하기 위해 실제로 필요한 경우가 아니라면 값으로 전달하고 싶지 않습니다. 따라서 실제로 값으로 전달하지 않는 한 어디에서나 참조를 사용하면 전달 된 값을 변경하지 않아도 성능이 크게 향상됩니다. 이러한 이유로 모든 인수를 참조하는 함수가있는 경우 호출자에게 함수가 수정하지 않을 내용을 알려 주어야합니다.
같은 원칙이지만 const를 사용하는 실용적인 이유를 추가하고 싶었습니다.