출처 => C++ How to Program (Detitel / Prenticehall) / 현재 그리고 미래지향적인 C++ 프로그래밍(장석우, 임정목 / 비앤씨에듀케이션)
생성자 (Constructor)란 무엇인가?
▶ 클래스는 생성자라는 멤버함수를 사용해서 객체를 초기화시켜준다. 복잡한 구조를 가져서 클래스에 일일이 대입하는 거이 곤란하므로 멤버에 값을 부여하는 일을 생성자가 한꺼번에 처리하여 준다.
▶ 생성자는 클래스의 이름과 동일한 이름을 가진 함수이다.
▶ 생성자는 객체가 만들어질 때 자동적으로 호출되어 객체를 초기화 시키는 역할을 한다.
생성자를 이용한 객체 초기화 예제
아래와 같은 소스코드를 보자
이 소스코드에서의 생성자라고 할 수 있는 Hello()메소드를 보면,
int형의 num, 그리고 string형의 name의 초기값만 설정한 것을 볼 수 있다.
▶ 이를 보면, Hello 객체가 선언됨과 동시에 내부적으로 생성자 함수 Hello()가 호출되어 멤버 변수들이 초기화되어 이를 출력함수 run()으로 출력이 되었음을 알 수 있다.
#include<iostream>
using namespace std;
class Hello {
private:
int num;
string name;
public:
Hello(){
num = 100;
name = "c++";
}
void run() {
cout << "num:" << num << "," << "name:" << name << endl;
}
};
void main() {
Hello h;
h.run();
}
디폴트 생성자와 인수가 2개인 생성자 정의 예제
▶ 아래의 예제처럼 한 클래스에서 여러개의 생성자를 정의할 수 있다. 인수를 갖지 않는 생성자 (p1)와 정수형 인수 2개를 가지는 생성자 (p2)를 중복하여 정의할 수 있다.
#include<iostream>
using namespace std;
class Point {
int xp, yp;
public:
Point() { xp = yp = 0; }
//생성자1
Point(int x, int y) { xp = x; yp = y; }
//생성자2
int get_x() {
return xp;
}
int get_y() {
return yp;
}
};
void main() {
Point p1;
//생성자 1 호출
Point p2(10, 20);
//생성자 2 호출
cout << "==p1==" << endl;
cout << "x 좌표:" << p1.get_x() << ", y좌표:" << p1.get_y() << endl;
cout << "==p2==" << endl;
cout << "x 좌표:" << p2.get_x() << ", y좌표:" << p2.get_y() << endl;
}
소멸자(Destructor)란 무엇인가?
▶ 소멸자는 생성자와 반대로 객체가 선언되어 사용되는 블록이 끝날 때(객체가 소멸될 때), 자동으로 호출되는 함수이다.
▶ 소멸자는 ~기호를 클래스 이름 앞에 붙여 정의한다.
▶ 소멸자 함수는 전달인수가 없고, 그러기에 오버로딩이 불가능하다.
소멸자 호출 예제
▶ main함수에서 객체 p를 생성하면서 10과 20을 멤버변수로 초기화하였다. 그리고 main함수가 종료되었다.
main함수에서는 ~Point()인 소멸자 함수가 선언되지 않았으나 결론적으로 소멸자가 호출되었음을 알 수 있다. 이를 통해 소멸자는 객체가 선언된 블록이 끝날 때 저절로 호출이 된다는 것을 알 수 있다.
#include<iostream>
using namespace std;
class Point {
int xp, yp;
public:
Point(int x, int y) {
cout << "생성자 호출" << endl;
//생성자 호출
xp = x; yp = y;
}
~Point() {
cout << "소멸자 호출" << endl;
}
int get_x() { return xp; }
int get_y() { return yp; }
};
void main() {
Point p(10, 20);
//생성자 호출
cout << "x 좌표:" << p.get_x()
<< ", y좌표:" << p.get_y() << endl;
}
문제
#include<iostream>
using namespace std;
class Point {
//채워보시오
};
void main() {
Point p1(10, 20);
{
Point p2(11, 22);
cout << "내부 p2=> x좌표 : " << p2.get_x()
<< ", y좌표 : " << p2.get_y() << endl;
}
cout << "외부 p1=> x죄표 : " << p1.get_x()
<< ",y좌표 : " << p1.get_y() << endl;
}
정답 ↓↓↓
class Point {
int xp, yp;
public:
Point(int x, int y){
cout << "생성자 호출" << endl;
xp = x; yp = y;
}
~Point() {
cout << "소멸자 호출" << endl;
}
int get_x() { return xp; }
int get_y() { return yp; }
};
'💻 개인공부 💻 > C | C++' 카테고리의 다른 글
[C++] 연산자 중복 (feat. 프랜드 함수) (0) | 2020.06.19 |
---|---|
[C++] 프랜드 함수 (0) | 2020.06.19 |
[C++] 포인터 변수 (feat. * / & / **) (0) | 2020.06.17 |
[C++] 조건문 (feat. if 문과 switch 문) (0) | 2020.06.17 |
[C++] 포맷 플래그 (0) | 2020.06.12 |