void print() {}
void print(const char* p) {printf("%s", p);}
위 두 함수는 함수 이름은 같지만 매개변수가 다른 함수들이다.
이 경우 C++에서는 두 함수를 다른 함수로 인식하지만, C에서는 같은 함수로 인식한다.
이는 C와 C++에서의 함수 구별 기준이 달라서 생기는 차이다.
C에서는 단순히 함수 이름으로만 함수를 구별하지만, C++에서는 다음 3가지 기준으로 함수를 구별한다.
- 함수 이름
- 입력 변수의 자료형
- 멤버 함수의 소속
따라서 C++의 2번째 기준에 의해 다음 두 함수는 같은 함수로 인식이 된다.
void print(const char* p) {printf("%s", p);}
void print(const char* p) {printf("HelloWorld%s", p);}
입력 변수의 자료형이 다른 경우 = 다른 함수로 인식
void print(int a) {}
void print(float a) {}
멤버 함수의 소속이 다른 경우 = 다른 함수로 인식
struct A {
void init() {printf("Hello World");}
}
struct B {
void init(); //멤버 함수 선언
}
void B::init() {printf("Hellow World");} //멤버 함수 정의
그렇다면 입력 변수의 자료형은 같으나 순서가 다른 경우는 어떨까?
GameObject (const char* shape, int pos, bool visible)
GameObject (bool visible, const char* shape, int pos)
결론부터 말하면 위 두 생성자 함수는 다른 함수로 인식이 된다.
함수의 형태는 다르지만 같은 기능을 수행하게 만들게끔 만들기 위해서는
GameObject (bool visible, const char* shape, int pos)
: GameObject(shape, pos, visible)
GameObject (const char* shape, int pos)
: GameObject(shape, pos, true)
생성자에서 생성자를 호출하면 된다.
그렇다면 const의 유무로도 overloading이 가능할까?
먼저, const 변수는 오버로딩의 기준이 되지 않는다. 그러나 레퍼런스나 포인터 앞에 붙은 const는 오버로딩의 기준이 된다.
생성자가 하나라도 없으면 컴파일에서 기본 생성자를 생성한다. 다르게 말하면, 생성자가 하나라도 있으면 컴파일에서 기본 생성자를 생성하지 않는다. 생성된 함수의 소속이 클래스에서 파생된 클래스의 것이라면 아래와 같이 parent의 생성자 또한 자동으로 추가된다.
Player() : GameObject() {}
만약 GameObject에 생성자가 하나라도 있어 기본생성자가 생기지 않을 시 GameObject의 기본 생성자를 만들어줘야 한다. 그러나 생성자는 초기화 기능이 있어야 하므로 GameObject() : GameObject(" ", 0, false) {}
를 추가하여야 한다.
그러나 이렇게 하는 GamObject의 기본 생성자를 생성하는 것보다
Player() : GameObject("(^_^)", 0, true) {}
위와 같이 Player의 기본생성자에서 기본값으로 초기화 하는 것이 더 나은 방법일 수도 있다.
그렇다면 배열의 경우는 생성자가 어떻게 생성될까?
Player players[10];
객체 배열은 반드시 기본생성자
를 호출하며 기본 생성자 외의 생성자를 호출하려면 다음과 같이 작성하여야 한다.
Player players[2] = {Player(" ", 10, true), Player(" ", 20, true)}
그러나 이 경우는 배열의 크기가 커지면 일일이 작성해야 한다는 문제가 생긴다.
따라서 배열의 크기가 큰 경우 다음과 같이 작성하여야 한다.
Player players[100000];
for(int i=0; i<100000; i++) {
players[i] = new Player(...)
}
포인터 배열을 생성하여 객체의 주소 값을 대입하는 것이다.
객체의 주소를 대입할 땐 복사생성자
가 호출되며 별도의 생성이 없으면 컴파일러가 자동으로 생성해 준다.