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

+ Recent posts