모범 사례, 과제, 기능 매개 변수 등 두 번째 줄을 주로 다룹니다.
일반적인 연습. 할 수있는 모든 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 (제 생각에)을 켜면 소스 코드 모듈 경계를 넘는 함수 호출에서도 프로그램 전체에 적용 할 수 있습니다.
하루가 끝나면 위의 모든 내용이 항상 포인터에 대한 참조를 선호하는 매우 견고한 경우입니다. 그들은 모든 라운드에서 더 안전합니다.