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

2020. 6. 18. 19:52·🖥️ 컴퓨터공학 🖥️/C | C++
반응형

출처 => 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
반응형

'🖥️ 컴퓨터공학 🖥️ > 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
'🖥️ 컴퓨터공학 🖥️/C | C++' 카테고리의 다른 글
  • [C++] 연산자 중복 (feat. 프랜드 함수)
  • [C++] 프랜드 함수
  • [C++] 포인터 변수 (feat. * / & / **)
  • [C++] 조건문 (feat. if 문과 switch 문)
공대생 배기웅
공대생 배기웅
군노답 미필 공대생 배기웅의 대학생활을 갈아 넣은 블로그
    반응형
  • 공대생 배기웅
    글쓰는공대생의 IT블로그
    공대생 배기웅
  • 전체
    오늘
    어제
    • 분류 전체보기 (166)
      • 🖊️ 공대생 글쓰기 🖊️ (17)
        • 공대생 회고록 (4)
        • 공대생의 끄적끄적 (4)
        • 슬기로운 공대생활 (9)
        • 무한도전 대학원생 (0)
      • 📈 산업공학 📈 (14)
        • 금융, 파생상품 (13)
        • 통계 (0)
        • 선형대수 (0)
        • 보험, 리스크관리 (0)
        • 재무회계 (1)
      • 🖥️ 컴퓨터공학 🖥️ (92)
        • 머신러닝, 딥러닝 (12)
        • 텐서플로우, 케라스 (1)
        • 알고리즘 (24)
        • 웹 (5)
        • Python (3)
        • C | C++ (23)
        • Java (15)
        • 코드 에러 모음집 (9)
      • 😙 취미, 교양 😙 (2)
        • 영어공부 (1)
        • 일본어회화 공부 (1)
      • 🔍 정보 공유 🔍 (38)
        • 대학생 외부활동 정보 (2)
        • 개발자관련 정보 (3)
        • 대입 논술 입시자료 정보 (22)
        • 프로그램 세팅 (11)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

    • [공지] 글쓰는 공대생입니다 😃
  • 인기 글

  • 태그

    재귀함수
    객체지향
    경제성공학
    이클립스
    백준
    알고리즘
    예외
    프로그래머스
    조작자
    스캐너
    OOP
    자바
    Operator
    acmicpc
    데이터베이스
    무작위 변수
    프랜드함수
    Java
    C++
    equals프레임워크
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
공대생 배기웅
[C++] 생성자와 소멸자
상단으로

티스토리툴바