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()
- Circle의 객체 생성
- 상속 객체인 Shape 호출
- Shape() 생성자 호출
- Circle 생성자로 와서 선처리 영역 확인 : 다른 생성자 호출(Circle(int))
- Circle(int) 생성자로 와서 선처리 영역 확인 : 다른 생성자 호출(_text(int))
- 멤버 변수 _text(int) 생성자 호출
- Circle(int) 생성자 호출
- Circle 생성자 호출
- Circle 소멸자 호출
- _text 소멸자 호출
- Shape 소멸자 호출
'프로그래밍 언어 > C++' 카테고리의 다른 글
[게임 프로그래머 입문 올인원] 객체지향 : static과 싱글톤 (33강) (0) | 2023.09.12 |
---|---|
[게임 프로그래머 입문 올인원] 객체지향 : 연산자 오버로딩 (32강) (0) | 2023.09.12 |
[게임 프로그래머 입문 올인원] 객체지향 : OOP 3대 요소 / 상속성, 은닉성, 다형성 (28, 29, 30강) (0) | 2023.09.11 |
[게임 프로그래머 입문 올인원] 객체지향 : 객체지향 개론 (27강) (2) | 2023.09.11 |
C++ 문자열 총정리 (0) | 2023.09.09 |