모범 사례, 과제, 기능 매개 변수 등 두 번째 줄을 주로 다룹니다.
일반적인 연습. 할 수있는 모든 const
것을 만들어보십시오 . 또는 다른 방법 const
으로 시작하려면 모든 것을 시작으로 만든 다음 const
프로그램이 작동하는 데 필요한 최소 세트를 제거하십시오 . 이것은 const-correctness를 얻는 데 큰 도움이 될 것이며 사람들이 수정하지 말아야 할 것에 미묘한 버그가 발생하지 않도록 보장 할 것입니다.
전염병처럼 const_cast <>를 피하십시오. 이에 대한 합법적 인 사용 사례는 하나 또는 두 가지이지만 매우 적습니다. const
객체 를 변경하려는 경우 const
첫 번째 속도로 객체를 선언 한 사람을 찾아서 그 문제를 논의하여 어떤 일이 발생해야하는지에 대한 합의에 도달하는 것이 좋습니다.
과제를 매우 깔끔하게 이끌어냅니다. 일정하지 않은 경우에만 무언가를 할당 할 수 있습니다. const 인 것을 할당하려면 위를 참조하십시오. 선언 int const *foo;
과 int * const bar;
다른 것들이 있음을 기억하십시오. const
여기의 다른 답변은 그 문제를 훌륭하게 다루었으므로 다루지 않겠습니다.
기능 매개 변수 :
가치에 의한 전달 : 예 void func(int param)
를 들어 , 발신 사이트에서 어떤 방식 으로든 상관하지 않습니다. 함수를 선언하는 유스 케이스가 void func(int const param)
있지만 호출자에게는 영향을 미치지 않으며 호출하는 동안 함수에 의해 전달 된 값을 변경할 수 없다는 점에서 함수 자체에만 영향을 미치지 않습니다.
참조로 전달 : 예 : void func(int ¶m)
이제 차이를 만듭니다. 방금 선언 한대로 func
변경할 수 param
있으며 모든 호출 사이트는 결과를 처리 할 준비가되어 있어야합니다. 선언을 void func(int const ¶m)
변경하여 계약 을 변경하고 func
이제는 변경할 수 없음을 보증합니다 param
. 즉, 전달되는 것은 다시 나오는 것을 의미합니다. 다른 사람들이 지적했듯이 이것은 변경하고 싶지 않은 큰 객체를 저렴하게 전달하는 데 매우 유용합니다. 참조를 전달하는 것은 큰 객체를 값으로 전달하는 것보다 훨씬 저렴합니다.
포인터를지나 : 예, void func(int *param)
그리고 void func(int const *param)
이 두 호출 된 함수가 지금 확인하기 위해 필요로하는주의와 거의 동의어 자신의 기준 상대에있는 nullptr
다른 계약 보증 보증한다 않는 한 func
그것은을받지 않겠다고 nullptr
에서 param
.
그 주제에 대한 의견. 이와 같은 경우 정확성을 입증하는 것은 어려울 정도로 어렵습니다. 실수하기가 너무 쉽습니다. 따라서 기회를 놓치지 말고 항상에 대한 포인터 매개 변수를 확인하십시오 nullptr
. 당신은 자신에게 고통과 고통을 저장하고 장기적으로 버그를 찾기 어렵다. 그리고 검사 비용은 먼지가 싸고 컴파일러에 내장 된 정적 분석이이를 관리 할 수있는 경우 옵티마이 저는이를 제거합니다. MSVC의 링크 타임 코드 생성 또는 GCC의 WOPR (제 생각에)을 켜면 소스 코드 모듈 경계를 넘는 함수 호출에서도 프로그램 전체에 적용 할 수 있습니다.
하루가 끝나면 위의 모든 내용이 항상 포인터에 대한 참조를 선호하는 매우 견고한 경우입니다. 그들은 모든 라운드에서 더 안전합니다.