2017. 11. 25. 20:21 C++/공부
C++] 기초(12) - 생성자(Costructor)
.** 본 게시물은 C++을 복습하며 정리하는 글입니다. 틀린 부분이 있다면 지적 부탁드립니다!! 현재 "윤성우의 열혈강의 C++"교재로 공부중이며 좀 더 상세한 설명을 원하시는 경우에는 책을 구매해서 찾아보시길 권장합니다.
[들어가기 전]
객체지향 언어에는 보통 "생성자"가 있다. 생성자에 대해서 알아보자.
[설명]
캡슐화를 위해 멤벼변수를 private로 선언한 후, 해당 변수들을 초기화 하려면 Init()함수를 생성해서 접근해야 한다. 이러한 방법이 불편하다면 생성자를 통해 초기화해도 된다. 생성자 또한 함수이다.
[생성자의 특징]
1) 클래스의 이름과 동일
2) 객체 생성 시 딱 한 번만 호출됨(중요)
3) 생성자도 함수의 일종이므로 오버로딩 가능
4) 생성자도 함수의 일종이니 매개변수에 디폴트 값 설정 가능
5) 개발자가 따로 생성자를 선언하지 않을 경우, 컴파일러에서 자동적으로
디폴트 생성자를 추가
6) 해당 객체를 new로 생성하지 않고, malloc() 함수로 메모리를 할당한 경우,
당연히 생성자는 타지 않음
예제 1) 생성자를 이용한 객체 생성 방식
ex)
class CTmp
{
private:
int num1;
int num2;
public:
CTmp(int n1, int n2)
{
num1 = n1;
num2 = n2;
}
void PrintData()
{
cout << num1 << "/" << num2 << endl;
}
};
void main()
{
CTmp tmp1(10, 20);
tmp1.PrintData();
CTmp* pTmp2 = new CTmp(100, 200);
pTmp2->PrintData();
}
생성자를 이용하여 객체를 생성하는 방식은 2가지가 있다.
방법 1) 전역 및 지역변수의 형태
=> 따로 메모리 해제를 하지 않아도 된다.
ex) CTmp tmp1(10, 20)
방법 2) 동적 할당의 형태
=> delete로 할당된 메모리를 해제해야 한다.
ex) CTmp pTmp2 = new CTmp(100, 200)
예제2) 생성자 오버로딩
ex)
생성자도 함수이므로 오버라이딩이 가능하다.
예제3) 디폴트 생성자
ex) 사용자가 생성자를 명시하지 않은 경우
개발자가 따로 생성자를 명시하지 않을 경우, 시스템에서 자동적으로 디폴트 생성자를 선언하며, 코드상에 명시되지는 않는다.
ex) 시스템이 자동적으로 생성자 추가
위의 ex)와 같이 시스템이 자동적으로 디폴트 생성자를 추가한다. 코드상에는 명시되지 않으며, 생성자의 역할을 한다. 그러므로, 개발자가 생성자를 명시한 경우에는 디폴트 생성자가 생성되지 않는다.
ex) 개발자가 생성자를 명시한 경우
위에서 설명한 바와 같이, 개발자가 생성자를 명시한 경우 디폴트 생성자는 추가되지 않는다. 따라서 아래와 같은 코드는 실행 불가하다.
CTmp tmp; (x)
CTmp* pTmp = new cTmp(); (x)
CTmp tmp(10, 20); (o)
=> 해당 방식의 생성자를 호출하려면, CTmp() {} 와 같이 생성자를 선언해야 함.
예제 4) 멤버 이니셜라이저(Member Initializer)를 이용하여 멤버 초기화
ex)
해당 코드 중, :num1(10), num2(20)이 멤버 이니셜라이저.
멤버변수로 선언된 클래스도 해당 생성자를 호출하여 초기화 가능하다.
ex)
CMembetInit(int n1, int n2);
CMemberInit m_memberInit;
CTmp::CTmp()
: m_memberInin(10, 20)
==> 이런 식으로 CTmp 클래스의 생성자를 호출할 때, 멤버변수인 m_memberInit의 생성자도 호출 가능하다.
[추가]
생성자 호출 방식에서 주의해야 할 점이 있다.
간단한 예제로 살펴보자.
ex)
위와 같은 코드가 있다고 가정할 때,
CTmp tmp(10); (o)
CTmp* pTmp = new CTmp(10); (o)
CTmp tmp(10, 20); (o)
CTmp* pTmp = new CTmp(10, 20); (o)
CTmp* pTmp = new CTmp; (o)
CTmp tmp(); (x)
와 같은 실행 결과를 보인다.
왜 "CTmp tmp();"로 생성자를 호출하는 것은 불가능한가?
=> 답은 해당 구문을 컴파일러가 함수 선언으로 인식하기 때문이다. 컴파일러는 해당 구문을 CTmp를 반환하며 매개변수가 void인 tmp 함수로 해석하기에 오류가 발생한다.
'C++ > 공부' 카테고리의 다른 글
C++] 기초(14) - 복사생성자(Copy Constructor) (0) | 2023.09.10 |
---|---|
C++] 기초(13) - 소멸자(Destructor) (0) | 2017.11.25 |
C++] 기초(11) - 캡슐화(Encapsulation) (0) | 2017.10.15 |
C++] 기초(10) - 정보은닉(Information Hiding) (0) | 2017.10.15 |
C++] 기초(9) - 참조자 반환 함수 사용 시 (1) | 2017.10.15 |