C++ 에서 const 타입과 not const 타입의 오버로딩 .. ㅜㅜ

naddolki의 이미지

C++ 에서 함수 오버로딩할 때 ..

void plusOne(int *);
void plusOne(const int *);

위의 경우 정상적으로 "오버로딩" 이 되는데..

void plusOne(int);
void plusOne(const int);

는 오버로딩이 되질 않을까요 ? (함수 중복 정의 오류가 남)

가령 ..

int plusOne(const int a)
{
return a+1;
}

int plusOne(int a)
{
return ++a;
}

위와 같은 두 경우 모두 사용이 가능해야 하는 게 아닐까요 ?

아시는 분 계시면 .. 좀 알려주셔요 ㅠㅠ

klara의 이미지

호출할 떄 구분할 수 있는 방법이 없기 때문입니다.
인자를 넘겨줄 때, const int* 는 int*로 캐스팅 없이는 복사될 수 없기 때문에, const int*와 int*는 구분이 가능합니다.

const int *a = ...
int *b = a // error!!!

하지만 int 와 const int는 서로 복사가 가능하므로 함수 호출할 때 어느쪽을 부른 걸지 알수가 없습니다.

const int a = ...
int b = a // no problem

etension의 이미지

void plusOne(const int var);
일반적으로 위와 같이 함수 파라미터에 const 를 쓴다는 것은 해당 파라미터 값을 함수 내에서 변경 시키지 않겠다는
의미란 것은 잘 알고 계시리라 생각합니다.

void plusOne(const int *var);
하지만 위와 같은 경우의 var 변수는 바뀔 수 있습니다. 다른 주소를 포인팅 할 수 있죠.
다시말해 var 변수 자체가 const가 아니라 const int* 라는 타입을 가지는 변수 입니다.

void plusOne(int *);
void plusOne(const int *);

즉 위와 같은 경우는 파라미터로 넘어오는 변수의 타입이 다르기 때문에 함수를 사용할때 넘겨진 인자를 통해
사용될 함수를 구분하고 결정 할 수 있지만

void plusOne(int *);
void plusOne(int * const );

이런 경우는 구분 하지 못합니다. (위 같은 경우는 같은 타입을 넘겨받지만 아래 것은 값을 변경하지 않겠다는 의미입니다.)