반응형
생성자는 객체를 만들게 되면 자동으로 실행되는 코드 입니다.
그럼, 상속관계에서의 생성자 호출은 어떤식으로 진행이 될지?
코드로 설명하겠습니다.
#include<iostream>
using namespace std;
class A {
public:
A() {
cout << "Class A" << endl;
}
};
int main(void) {
A a;
return 0;
}
코드 실행 결과 입니다.
이처럼 객체 생성만 해도 생성자는 자동 호출이 됩니다.
그럼 상속을 받으면 생성자 호출은 어떤식으로 될까요?
#include<iostream>
using namespace std;
class A {
public:
A() {
cout << "Class A!!" << endl;
}
};
class B : public A {
public :
B() {
cout << "Class B!!" << endl;
}
};
int main(void) {
B b;
return 0;
}
B객체만 선언해도 이런식으로 생성자 호출이 됩니다.
즉, 상속관계에 있을 때 자식 객체를 생성하면!!
맨위 부모 클래스의 생성자 부터 차례대로 생성자 호출이 일어나는 것입니다.
생성자가 private이라면???
다른 함수에서 객체 선언 시 생성자 호출 자체가 불가능 해 집니다.
따라서 생성자는 public으로 선언하는 것이 보통입니다.
하지만!!!! private으로 선언된 생성자도 호출은 가능합니다.
#include<iostream>
using namespace std;
class A {
private:
int num;
public:
A() {}
A* createA(int number) {
A *a = new A(number);
return a;
}
int get() {
return num;
}
private:
A(int num) {
this->num = num;
}
};
int main(void) {
A a;
A *obj = a.createA(10);
cout << obj->get() << endl;
return 0;
}
이런식으로 private생성자도 호출이 가능합니다.
단!! 이러한 경우에는 생성자의 호출방법을 제안하고자 할때 쓰이게 됩니다.
그렇다면 생성자의 매개변수, 인자 값이 다르다면 어떻게 될까요?
#include<iostream>
#include<string>
using namespace std;
class A {
public:
A() {
cout << "Class A!!" << endl;
}
};
class B : public A {
int num;
string name;
public :
B() {
cout << "Class B!!" << endl;
}
B(int num, string name) {
this->num = num;
this->name = name;
printf("Class B!! num = %d, name = %s\n", this->num, this->name.c_str());
}
};
int main(void) {
B b(10, "Hwan");
return 0;
}
실행 결과
즉, 자식 클래스 생성자의 매개변수가 달라져도(오버로딩) 부모 클래스의 기본 생성자 호출은 무조건 일어난다는 뜻이 됩니다.
그렇다면 부모 생성자도 매개변수로 받는게 있고 그 생성자를 호출하고 싶다면??
#include<iostream>
#include<string>
using namespace std;
class A {
private:
int num;
public:
A() {
cout << "Class A!!" << endl;
}
A(int num) {
this->num = num;
cout << "Class A!!, num = " << this->num << endl;
}
int get() {
return num;
}
};
class B : public A {
int num;
string name;
public:
B() {
cout << "Class B!!" << endl;
}
B(int num1, int num2, string name) : A(num1) {
this->num = num2;
this->name = name;
printf("Class B!! num = %d, name = %s\n", this->num, this->name.c_str());
}
};
int main(void) {
B b(100, 10, "Hwan");
cout << "Class A : num = " << b.get() << endl;
return 0;
}
이런식으로 초기화해 줄 수 있습니다.
그리고 이런식의 초기화 방법을 맴버이니셜라이져 라고 하는데 이에 대해선 다음에 상세히 설명하겠습니다.
반응형
'프로그래밍 > C++' 카테고리의 다른 글
C++ 소멸자란? (0) | 2019.02.22 |
---|---|
C++ this 포인터?? 그럼 *this 는 뭐지? (8) | 2019.02.22 |
C++의 생성자, 문자열 초기화 C2664 오류시 해결!! (1) | 2019.02.20 |
C++ public, protected, private에 대한 설명 (1) | 2019.02.19 |
c++ new의 사용법, malloc과의 차이(free, delete) (2) | 2019.01.19 |
댓글