티스토리 뷰
▶ 생성자와 소멸자는
- 사용자가 정의하지 않아도 되는 멤버함수
- 시스템 내부에서 항상 객체의 생성, 소멸을 담당
- 사용자가 유용하게 사용하려 할 경우에만 가시화시켜 선언, 정의함
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 |
댓글