💻 개인공부 💻/C | C++

[C++] 생성자와 소멸자

공대생 배기웅 2020. 6. 18. 19:52
반응형

출처 => 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; }
};
728x90
반응형