티스토리 뷰

C++

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

JH_ 2021. 10. 19. 16:13

▶ 생성자와 소멸자는 

  • 사용자가 정의하지 않아도 되는 멤버함수
  • 시스템 내부에서 항상 객체의 생성, 소멸을 담당
  • 사용자가 유용하게 사용하려 할 경우에만 가시화시켜 선언, 정의함

1. 생성자

일반 자료형의 경우 컴파일러가 처리해 주지만

사용자 정의형인 클래스의 객체를 초기화하는 함수가 생성자이다.

 

1) 변수 초기화 하는 방법

C++에서 초기화 클래스 멤버변수 초기화
int a=10;
int a(10);
int a{10};
생성자( ) { age=1; }
생성자( ) : age(1){ }
생성자( ) : age{1}{ }

 

생성자 정의 X

#include <iostream>
using std::cout;
class Dog {
private:
	int age = 1; //변수 초기화
public:
	int getAge() { return age; }
	void setAge(int a) { age = a; }
};
int main()	
{
	Dog happy, coco;
	cout << happy.getAge() << coco.getAge();
	return 0;
}

생성자 정의

#include <iostream>
using std::cout;
class Dog {
private:
	int age;
public:
	Dog() { age = 1; } // 생성자 정의, 초기화 
	int getAge() { return age; }
	void setAge(int a) { age = a; }
};
int main()
{
	Dog happy; //happy객체가 생성되는 순간 생성자가 자동 호출됨
	cout << happy.getAge();
	return 0;
}

 

 

2) 생성자의 특징

  • 생성자의 이름은 클래스명과 같음
  • 클래스 객체가 생성될 때마다 자동 호출, 멤버변수 초기화 담당
  • 리턴형을 쓰지 않음 (void, int ...)
  • 객체마다 초기화 값이 다를 수 있으므로 하나의 클래스에 여러 개의 생성자 존재 가능

2. 소멸자

1) 소멸자의 특징

  • 소멸자의 이름은 클래스명과 같고, 앞에 ~를 붙임
  • 객체가 소멸될 때 자동 호출
  • 리턴형과 매개변수가 없음 (void ...)
  • 하나의 클래스에 유일

2) 소멸자의 용도

  • 객체가 소멸될 때 하고 싶은 코드 작성
  • 사용한 메모리 공간이 불필요하게 될 때 해당 메모리를 다른 객체에 반납하는 용도

소멸자 예시

#include <iostream>
using std::cout;
class Dog {
private:
	int age;
public:
	Dog(int a) { age = a; cout << "멍\n"; }
	~Dog() { cout << "소멸\n"; } //소멸자 생성
	int getAge() { return age; }
	void setAge(int a) { age = a; }
};
int main()
{
	Dog happy(5); //생성자 호출 + age값 줌
	cout << "main 함수 시작\n";
	cout << happy.getAge();
	cout << "\nmain 함수 끝\n";
	return 0;
} // <- 소멸자 호출

3. this 포인터

  • 객체를 통해 멤버를 호출할 때 컴파일러가 객체의 주소를 this포인터에 넣은 다음 멤버 호출 ( 객체 → this포인터에 객체 주소 넣음 → 멤버 호출 )
  • 멤버 함수 수행 후 객체 자신을 되돌릴 경우: return *this
  • 멤버함수에서 볼 때 어떤 객체가 자신을 호출했는지 알고자 하는 경우  this포인터를 사용

this 포인터 예시

#include <iostream>
using std::cout;
using std::endl;
class Dog {
private:
	int age;
public:
	Dog(int a) { 
		age = a; 
		cout << this << endl; 
	} //this에 주소가 들어감
	int getAge() { return age; }
	void setAge(int a) { age = a; }
};

int main()
{
	Dog happy(5), meri(3);
	cout << happy.getAge(); //008FF8AC
	cout << meri.getAge(); //008FF8A0
	return 0;
}

'C++' 카테고리의 다른 글

[C++] 7. 함수 오버로딩과 디폴트 매개변수  (0) 2021.11.09
[C++] 5. const  (0) 2021.11.02
[C++] 2. 클래스와 객체 만들기  (0) 2021.10.12
[C++] 1. 객체 지향 언어  (0) 2021.10.04
[C++] 기본 형식  (0) 2021.09.28
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday