C++

ObjectInit,Constructor(생성자)

Nin 2020. 12. 13. 01:43

프로그래머라면 반드시 초기화를 해줘야 한다 !(초기값을 넣어준다)

초기화: 자료형이 선언됨과 동시에 값을 입력해주는 것

class Test
{
public:
    int a = 0;
    int b = 0;
    int c = 0;
};

위의 방법은 클래스 선언의 변수에서부터 초기화를 해주는 방법으로 리터럴 초기화라고 한다.

c++ 14부터 지원하는 문법이다.

int main()
{
   Test NewTest = {10, 10, 10};
}

위의 방법은 이니셜라이즈 리스트 초기화라고 한다.

단점은 멤버변수가 public이여야만 가능하다.

private이 내부에 하나만 존재해도 사용 불가 !

Test NewTest = Test();

위 방법은 디폴트 생성자 초기화라고 한다.

어떤값이 들어가 있는지 모를수도 있기 때문에 명시적으로 초기화를 해주는것이 좋다.

사실 이 방식도 그냥 해주는것이 아니라 특수한 함수가 실행되는 것이고 생략되어 있는것이다.

class Test
{
private:  //명시적 표현
   int a;
   int b;  
   int c;
public: //생성자
   Test()
   {
   
   }
   
void Func()
   {
      this->a = 400;
   }
};

위의 코드에 있는 생성자라는 함수는 일반 멤버함수와는 특이한 차이점들이 있다.

1. 객체가 생성될 때 자동 호출 된다.

 

2. 이 생성자를 만들지 않았을 때만 디폴트 생성자라는 것을 만들어 주지만 

   c++ 버전에 따라서 멤버변수 값이 다를 수 있다.(반드시 해주자!)

   -> 만약 언제든지 기본으로 디폴트 생성자가 만들어 진다면 

       프로그래머의 의도를 제대로 전달할 수 없다.

 

3. 클래스 이름과 같아야 한다

   -> 클래스 이름과 같지 않다면 어떻게 객체를 만들지 알 수 없다.

3-1. 전역 함수처럼 사용할수 있다. 

생성자만 가능한 이유 : (멤버 함수란 this가 필요하기 때문에, 객체를 기반으로 호출되어야한다)

3-2. 전역으로만 호출이 가능하고 일반 멤버함수처럼은 호출할 수 없다.

4. 리턴값이 없다.

   -> 생성자가 객체를 만들어서 리턴하지 않으면 문법적 혼란이 올수밖에 없다.

 

5. 맴버이니셜라이즈라는 문법을 사용 가능하다. 

   ->맴버이니셜라이즈가 없으면 초기화가 불가능하다.

Test() : a(10),c(20),b(30)
{
}

이런식으로 초기화를 해주는 문법이며

생성자() : 멤버변수의 이름(초기값), 멤버변수의 이름(초기값) 방식으로 사용.

멤버변수를 적을 때 선언 순서와는 상관없다.  

멤버변수의 선언과 동시에 값을 넣어주기 때문에 진정한(?) 초기화라고 볼 수 있다.

생성자 내에서 this-> a = 10; 이라고 해주면 a에는 같은 10이라는 값이 들어가겠지만 

이건 사실상 대입을 해주고 있는 것이다.

생성자 역시 오버로딩이 가능하다.