프로그래밍 언어/C++

[게임 프로그래머 입문 올인원] 객체지향 : 멤버 변수 초기화 (31강)

순정법사 2023.09.11

C. 멤버 변수 초기화

1. 멤버 변수 초기화 방식

a. 3가지 초기화 방식 

1) 생성자 내부

 

제일 나쁜 방법. 크게 문제가 되진 않지만 비효율적으로 동작

 

 

💙 객체가 객체를 구성하는 순서

Circle이 Shape을 상속하면서 Text를 멤버 변수로 가진다고 하면


이렇게 선처리 영역에서 먼저 생성자를 호출하면서 먼저 상속하고 구성되는 요소들 부터 생성되고 소모함

💥 생성자 내부에서 초기화 하는 방식이 제일 안좋은 이유

위처럼 선 처리 영역에서 먼저 생성된 Text() 멤버변수를
아래 그림처럼 생성자 내부에서 또 한번 생성하게 되면 


이렇게 당연하게도 Text() 생성자를 두번 호출하게 된다
(심지어 내부에서 생성한 생성자는 바로 소멸되어 호출 순서도 변경됨)

👉 따라서 효율 측면에서 너무 비효율적이라 안좋다!!

 

2) 멤버 변수 생성시

 

모든 생성자에서 같은 초기화 값으로 진행되어서 코드가 깔끔해짐

 

 

3) 정석 문법 (선처리)

 

선처리 영역에서 생성함

대부분의 경우 이렇게 호출됨

 

💙 선처리 영역에서 초기화할 수 밖에 없는 경우


위와 같이 가끔 멤버 변수가 주소값이나 const 값처럼 특별한 값을 초기화 해야 한다고 하면
멤버 변수 선언시에는 값을 초기화 할 수 없음 

이렇게 선처리 영역에서 처리해줘야 함

 

b. 생성자의 생성자 호출 

생성자가 생성자를 또 호출할 수 있음

 

 

위와같이 Circle이 Circle의 생성자를 호출 할 수 있음

 

생성자가 두번 호출 되었지만 소멸자가 하나만 생성되었다는 단점이 있음.. ➡ 따로 확인 필요

 

e. 객체의 생성자 호출 순서

시험에도 굉장히 잘 나오는 문제!! 이번 기회에 잘 기억해두자

 

⏳ 예제 : 객체의 생성자 호출 순서

#include <iostream>
using namespace std;

class Shape {
public:
    Shape() {
        cout << "Shape()" << endl;  //3.
    }
    ~Shape() {
        cout << "~Shape()" << endl; //11.
    }
};

class Text {
public:
    Text() {
        cout << "Text()" << endl;
    }
    Text(int a) {
        _a = a;
        cout << "Text(" << a << ")" << endl;    //6.
    }
    ~Text() {
        cout << "~Text()" << endl;  //10.
    }

public : 
    int _a = 0;
};
 
class Circle : public Shape {   //2.
public:
    Circle() : Circle(5)    //4.
    {
        cout << "Circle()" << endl; //8.
    }
    Circle(int a) : _text(3)   //5.
    {
        cout << "Circle(" << a << ")" << endl;  //7.
    }
    ~Circle() {
        cout << "~Circle()" << endl;    //9.
    }
public:
    int _color;
    Text _text;
};

int main()
{
    Circle c1;  //1.
}

✨ 실행결과

Shape()
Text(3)
Circle(5)
Circle()
~Circle()
~Text()
~Shape()

 

  1. Circle의 객체 생성
  2. 상속 객체인 Shape 호출
  3. Shape() 생성자 호출
  4. Circle 생성자로 와서 선처리 영역 확인 : 다른 생성자 호출(Circle(int))
  5. Circle(int) 생성자로 와서 선처리 영역 확인 : 다른 생성자 호출(_text(int))
  6. 멤버 변수 _text(int) 생성자 호출
  7. Circle(int) 생성자 호출
  8. Circle 생성자 호출
  9. Circle 소멸자 호출
  10. _text 소멸자 호출
  11. Shape 소멸자 호출

 

 

 


출처 : https://www.inflearn.com/course/%EA%B2%8C%EC%9E%84-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8-%EC%9E%85%EB%AC%B8-%EC%98%AC%EC%9D%B8%EC%9B%90-rookiss#curriculum

 

[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버 -

어디부터 시작할지 막막한 게임 프로그래밍 입문자를 위한 All-In-One 커리큘럼입니다. C++, 자료구조/알고리즘, STL, 게임 수학, Windows API, 게임 서버 입문으로 이어지는 알찬 커리큘럼으로 게임 프

www.inflearn.com