거의 모든 다른 답변은 정확하지만 이것의 한 가지 측면을 놓치고 있습니다 const
. 함수 선언에서 매개 변수에 대해 extra를 사용 하면 컴파일러는 본질적으로이를 무시합니다. 잠시 동안 포인터가되는 예제의 복잡성을 무시하고 int
.
void foo(const int x);
다음과 같은 기능을 선언합니다.
void foo(int x);
함수 정의 에서만 추가 const
의미가 있습니다.
void foo(const int x) {
// do something with x here, but you cannot change it
}
이 정의는 위의 선언 중 하나와 호환됩니다. 발신자는 상관하지 않는 x
것입니다 const
호출 사이트에서 관련이없는의 구현 세부 사항입니다 --that.
데이터에 대한 const
포인터 가있는 경우 const
동일한 규칙이 적용됩니다.
// these declarations are equivalent
void print_string(const char * const the_string);
void print_string(const char * the_string);
// In this definition, you cannot change the value of the pointer within the
// body of the function. It's essentially a const local variable.
void print_string(const char * const the_string) {
cout << the_string << endl;
the_string = nullptr; // COMPILER ERROR HERE
}
// In this definition, you can change the value of the pointer (but you
// still can't change the data it's pointed to). And even if you change
// the_string, that has no effect outside this function.
void print_string(const char * the_string) {
cout << the_string << endl;
the_string = nullptr; // OK, but not observable outside this func
}
const
매개 변수가 포인터인지 여부에 관계없이 매개 변수를 만들 수있는 경우에도 C ++ 프로그래머는 거의 없습니다 .