class CObj
{
public:
//생성자의 형태
CObj()
{
cout << "생성자 호출" << endl;
}
CObj(int _a, double _b)
{
m_iA = _a;
m_dB = _b;
cout << "인자 있는 생성자 호출" << endl;
}
private:
int m_iA;
double m_dB;
};
생성자
-> 객체 생성 시 자동으로 호출 되는 것.
-> 사용자가 호출하지 않는다.
-> 함수의 일종으로 인자 타입, 인자 개수에 따른 오버로딩이 가능하다.
-> 클래스의 이름으로 정의된다.
-> 반환 타입이 없다.
-> 객체 생성은 외부에서 진행하기 때문에 생성자의 멤버 접근 지정자는 public으로 설정한다.
-> 객체는 생성자에 의해 완성된다.
생성자의 주 사용 목적
-> 객체 멤버로 초기화할 값이 있을 경우 사용한다.
생성자로 데이터를 전달하는 방법
-> C++ 초기화 형식과 동일하다.
CObj obj(10, 3.14);
생성자 사용 시 주의 사항
#1. 객체 생성은 생성자 호출에 의해 완성된다.
-> 호출할 생성자가 없을 경우 객체를 만들 수 없다.
-> 오버로딩을 이용하여 생성자를 여러 개 정의해주어야 한다.
CObj obj1;
CObj obj2(10, 3.14);
#2. 디폴트 생성자
-> 사용자가 생성자를 정의하지 않을 경우 컴파일러는 디폴트 생성자를 자동으로 생성하여 호출한다.
-> 단, 사용자가 한개 이상의 생성자를 정의할 경우 디폴트 생성자는 생성하지 않는다.
explicit 키워드
-> 생성자 앞에 explicit 키워드를 명시하면 C기반의 초기화(형 변환)을 막는다.
class CObj
{
public:
explicit CObj() {}
explicit CObj(int _a) { m_a = _a; }
public:
void Func()
{
cout << m_a << endl;
}
private:
int m_a;
};
// C기반의 초기화
CObj obj2 = 10; // 불가능
-> 초기화는 무조건 C++기반의 초기화만 허용한다.
// C++기반의 초기화
CObj obj2(10); // 가능
예를 들어 다음과 같이 대입을 하게 되면
CObj obj3 = 20;
대입 연산자 기준 좌측은 사용자 정의 자료형, 우측은 int형이다.
즉, 타입이 다른 자료형끼리 대입이 진행되고 있다.(초기화가 가능)
대입 연산자 기준 좌측 자료형으로 형 변환이 발생했다.
20이라는 int형 데이터가 CObj Temp(20) 이라는 형태로 형 변환이 발생하고,
CObj obj3 = Temp 형식으로 값을 대입하고 있다.
형 변환이 발생한다 하여도 사용자가 보기에는 어색함이 있을 수도 있다.
이를 방지하기 위하여 explicit 키워드를 사용한다.
소멸자
-> 객체 소멸 시 자동으로 호출되는 것.
-> 생성자와 비슷하지만 반대 개념이다.
-> 사용자가 소멸자를 정의하지 않을 경우 컴파일러가 디폴트 소멸자를 자동으로 생성하여 호출한다.
-> 사용자가 소멸자를 정의하면 디폴트 소멸자는 생성되지 않는다.
-> 객체 소멸 또한 외부에서 진행되기 때문에 public으로 설정해준다.
-> 객체 멤버로 동적할당한 변수가 있을 경우 해제하는 용도로 사용한다.
class CObj
{
public:
CObj() { cout << "생성자 호출" << endl; }
~CObj() { cout << "소멸자 호출" << endl; }
};
생성자와 소멸자의 호출 순서
객체 생성 -> 메모리 할당 -> 생성자 호출 -> 소멸자 호출 -> 메모리 해제 -> 객체 소멸
'Programming > C++ Basic' 카테고리의 다른 글
C++ 파일 입출력(fopen_s, fread(), fwrite()) (0) | 2020.09.13 |
---|---|
C++ 전방 선언 (0) | 2020.09.13 |
C++ 메모리 함수 (0) | 2020.09.13 |
C++ 클래스, 클래스의 4대 속성 (1) | 2020.09.10 |
C++ Debug, 조건식 Debug (0) | 2020.09.08 |