• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

초기화 리스트 사용에 대해서

22.01.02 12:26 작성 조회수 229

0

초기화 리스트를 사용할경우에 클래스 내부 클래스의 원하는 생성자를 호출 할 수 있는 차이가 있고

 

클래스 내부에있는 멤버 클래스? 가 기본 생성자가 없을경우에 반드시 초기화리스트를 사용해야 하는거군요.

 

또 생각해보면 기본생성자가 있다고 하더라도 초기화 리스트를 사용하지 않고 생성자 내부에서

_inventory = Inventory(20);

와 같은식으로 사용할때 결국 복사생성자로 복사가 될텐데

이전 강의에서 말씀하신것처럼 Inventory 클래스의 복사 생성자게 제대로 만들어져 있지 않으면 멤버 변수들 중에 간단히 복사가 안되는것들로 인한 문제가 생길수 도 있겠네요!

 

그리고 말씀하신 C++11 문법에 추가된 부분은 이 초기화리스트의 다른 표현방식 혹은 문법이라고 이해하면 될까요?

 

마지막으로 구태여 생성자에서 초기화 하는것과 초기화리스트에서 초기화 하는것에 대해 차이를 둔 점이 

예전 전역변수를 초기화 하지않으면 .bss에 위치하고 상대적으로 exe파일 크기를 적게 잡아먹는것처럼 

컴파일러 내부에서 최적화하는데 어떤 이점이 있어서 나눈건가요?

 

 

----수정이요----

다음 강의를 듣고 복사 연산자에 대해서 알게되고 다시 생성자 내부에서 초기화 하는 

_inventory = Inventory(20);

위와 같은방식으로 했을때 여기서 =는 복사생성자가 아닌 복사 연산자로 작동을 하는군요? 

생성자 내부에서 초기화 하려고하는건 결국 멤버내 클래스를 기본생성자로 생성하고(_inventory 생성)

추가로 뒷부분의 생성자로 생성된 임시 객체(Inventory(20))을 복사해서 넣는 식으로 작동하는군요!

 

그렇다면 클래스 내부의 멤버 클래스(_inventory )를 복사생성자로 생성하고 싶을때는

해당 클래스의 인수로 복사생성자로 만들고싶은 클래스를 받은 뒤 그걸 초기화리스트로 초기화 하는방법이

멤버클래스(_inventory )를 복사생성자로 생성시킬 수 있는 유일한 방법인가요? 이런식으로요

Knight(Inventory& i) : _inventory(i){}

답변 1

답변을 작성해보세요.

0

C++11의 initializer_list는 다른 아이인데 후반부에 나오고
: 뒤에 초기화를 하면 두 번 복사하지 않아 성능이 아주 미세하게 좋아집니다.
그리고 참조값처럼 문법적으로  : 뒤에서 값을 세팅해야 하는 경우도 있고
여튼 C++은 복잡하고 별별 상황이 있기 때문에
그냥 이런 저런 실습을 해보시기 바랍니다.
그리고 이런 세세 부분은 질문하시기 보다는
직접 실습을 통해 되는 것과 안 되는 것을 학습해보시기 바랍니다.
어차피 나중에도 본인이 연습한 것을 위주로 사용을 하게 됩니다.