생성자 초기화 리스트
Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 104개 중 22번째.
이전 레슨에서 Player(std::string n, int h) : name(n), health(h) {}와 같은 콜론 구문을 본 적이 있습니다. 이를 멤버 이니셜라이저 목록이라고 하며, C++에서 멤버를 초기화하는 데 선호되는 방법입니다.
initializer 목록은 constructor의 매개변수 목록 뒤에 콜론으로 시작하여 나타납니다. 각 멤버는 해당 값으로 directly initialized되고, 쉼표로 구분됩니다:
class Rectangle {
int width;
int height;
const int id;
int& reference;
public:
Rectangle(int w, int h, int i, int& r)
: width(w), height(h), id(i), reference(r) {
// 생성자 본문 (비어 있을 수 있음)
}
};생성자 본문에서 대입 대신 초기화 리스트를 사용하는 이유는 무엇일까요? 대입을 사용하면 멤버가 먼저 기본 생성된 다음 새로운 값이 대입됩니다. 초기화 리스트를 사용하면 멤버가 올바른 값으로 직접 생성되므로 더 효율적이며, 경우에 따라서는 반드시 필요합니다.
특정 멤버는 다음 목록을 사용하여 초기화해야 합니다:
const멤버 - construction 후에는 cannot 할당할 수 없음
- 참조 멤버 - 초기화 시 바인딩되어야 함
- 기본 생성자가 없는 멤버
class Player {
const int maxHealth; // 초기화 리스트를 사용해야 함
std::string name;
public:
// 이것은 작동함
Player(int max, std::string n) : maxHealth(max), name(n) {}
// 이것은 컴파일되지 않음:
// Player(int max) { maxHealth = max; } // 오류!
};멤버는 초기화 목록의 순서가 아니라 class에서 declared된 순서로 initialized됩니다. 혼동을 피하려면 항상 선언 순서에 따라 초기화 목록을 작성하세요.
챌린지
쉬움멤버 초기화 리스트가 언제, 왜 필수적인지 보여 주는 게임 엔진용 configuration system을 만들어 보겠습니다. 초기화 리스트 구문을 사용하여 GameConfig 클래스를 만들고, 초기화 리스트를 사용해 반드시 initialized되어야 하는 멤버를 포함합니다.
코드를 구성하기 위해 두 개의 파일을 만듭니다:
GameConfig.h: 게임 설정을 저장하는GameConfig클래스를 define합니다. 클래스에는 다음이 있어야 합니다:const std::string gameName: 생성 후 change할 수 없는 게임 제목const int maxPlayers: constructor에서 고정되는 최대 플레이어 수int& difficultyRef: external difficulty 설정에 대한 referenceint screenWidth및int screenHeight: display 설정을 위한 일반 멤버- 필요한 모든 매개변수를 받고 initializer list를 사용해 EVERY 멤버를 initialized하는 constructor. initializer list는 클래스에서 멤버가 declared된 순서를 따라야 합니다
- 다음 형식으로 configuration을 출력하는
display()메서드:Game: <gameName> Max Players: <maxPlayers> Difficulty: <difficultyRef value> Resolution: <screenWidth>x<screenHeight>
main.cpp: input에서 configuration 값을 읽고 GameConfig object를 만듭니다. 다음이 필요합니다:- input에서 게임 이름(string), 최대 플레이어 수(int), difficulty(int), width(int), height(int)를 읽습니다. 각각 별도의 줄에 입력됩니다
- config가 reference할 difficulty용 local
int변수를 만듭니다 - initializer list constructor를 사용해
GameConfigobject를 만듭니다 - 초기 configuration을 표시하기 위해
display()를 Call합니다 - difficultly 변수를 directly 수정합니다(2를 곱합니다)
"After difficulty change:"를 출력합니다- reference가 updated value를 반영한다는 것을 보여 주기 위해
display()를 again Call합니다
이 challenge는 initializer list가 중요한 이유를 보여 줍니다. const 멤버와 reference 멤버는 constructor body에서 assigned될 수 cannot 있습니다. 이들은 list에서 initialized되어야 합니다. reference 멤버는 또한 original variable에 대한 변경 사항이 config object를 통해 어떻게 반영되는지 보여 줍니다.
#include "GameConfig.h"를 사용하여 main.cpp에 header file을 include하세요.
직접 해보기
#include <iostream>
#include <string>
#include "GameConfig.h"
using namespace std;
int main() {
// 입력 값 읽기
string gameName;
getline(cin, gameName);
int maxPlayers;
cin >> maxPlayers;
int difficulty;
cin >> difficulty;
int width;
cin >> width;
int height;
cin >> height;
// TODO: 초기화 리스트 생성자를 사용하여 GameConfig 객체 생성
// 생성자는 다음을 받아야 합니다: gameName, maxPlayers, difficulty (참조로), width, height
// TODO: display()를 호출하여 초기 구성 표시
// TODO: difficulty 변수를 직접 수정 (2를 곱함)
// TODO: Print "After difficulty change:"
// TODO: display()를 다시 호출하여 업데이트된 구성 표시
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C++ 컴파일러