클래스의 객체를 선언하면 메모리에 이 객체가 즉시 생성된다.
다만 클래스도 하나의 자료형인 만큼, 여느 변수처럼 할당만 되지 값이 있진 않다.
때문에 모두 쓰레기 값일 것이다.
그래서 초기화를 해줘야 한다.
만약
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class position { public: int x; int y; }; int main(void) { position a; a.x = 10; a.y = 10; } | cs |
이러한 코드가 있으면, 생성할 때마다 위의 코드와 같은, 변수를 하나 하나 초기화 해야 하는 번거로움이 있을 것이다.
이래서 등장한 것이 생성자이다.
생성자는 객체를 초기화 하기 위해서 존재한다.
우리가 int a = 5를 하는 것 처럼
position a(10, 10);을 하면 a라는 position클래스 객체를 x에 10, y에 10 을 넣어서 생성할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #include <stdio.h> #include <stdlib.h> #include <string.h> class position { private: int x; int y; public: position(int ax, int ay) { x = ax; y = ay; } void print() { printf("%d %d\n", x, y); } }; int main(void) { position a(10, 30); a.print(); } | cs |
위와 같이 생성자는 컴파일러에 의해 호출되므로, 이름이 고정적으로 정해져 있다. 생성자의 이름은 항상 클래스의 이름과 동일하다.
필요할 경우 인수를 받을 수는 있지만, 리턴값은 있을 수 없다.
생성자는 객체가 생성될 때 자동으로 컴파일러가 호출한다. 사용자는
객체 선언문의 뒤쪽에 생성자로 전달될 인수를 명시함으로써 두 가지
방법으로 호출할 수 있다.
1. position a(10, 10);
2. position a = position(10, 10);
생성자도 분명 하나의 함수이기 때문에, 오버로딩이 가능하다.
그래서 디폴트 인수 사용도 가능하고 인라인으로 선언할 수도 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include <stdio.h> #include <stdlib.h> #include <string.h> class position { private: int x; int y; public: position(int ax, int ay) { x = ax; y = ay; } position(int ax) { x = ax; y = 0; } void print() { printf("%d %d\n", x, y); } }; int main(void) { position a(10); a.print(); } | cs |
이런 코드가 가능하게 해준다.