프로그래밍/C++

#39. 생성자 & 소멸자

코딩하는상후니 2022. 7. 19. 22:12

 
*this 포인터  :  해당 클래스 자신
 

=> lea ecx, [k1]  , 즉, k1 의 주소가 ecx 에 복사가 되는것을 볼 수 있음.

 

 

 

 

그런다음,
mov dword ptr [this], ecx
=> [this] 포인터 에 ecx 값을 복사하는 것을 볼 수 있음.
 
 
=> 해당 this 주소를 이용하는 것을 볼 수 있음.
 
=> 지금 class 멤버변수 선언순서는
_hp
_attack
_posY / _posX 순이고
만약, _attack = 1000; 을 실행 시,
mov dword ptr[ eax+4 ], 3E8h
주소값을 4byte 옮겨 데이터 복사시킴.
 

 

 

 

 

*생성자 ( Constructor )
=> 여러 개 존재 가능
 
 
*암시적 생성자
=> 생성자를 명시적으로 만들지 않으면,
아무 인자도 받지 않는 [기본 생성자] 가 컴파일러에 의해 자동으로 만들어짐.
=> 기본 상태 ( Kngiht ( ) { } )
 
그러나,
우리가 명시적으로 아무 생성자 하나 만들면,
자동으로 만들어지던 [기본 생성자] 는 더 이상 만들어지지 않음 !
 
=> 기본 생성자 이외의 다른 생성자를 만들 시,
따로 기본 생성자를 만들지 않으면 기본 생성자로 객체를 만들 수 없다.
 
 
 

 

 

*복사 생성자 ( Knight::Knight(const Knight& other) )
=> 기본으로 만들어짐.
 
Knight k2(k1);
Knight k3 = k2;
 
Knight k4;
k4 = k3;  => 이건 '대입 연산자'

 
 

 

*타입 변환 생성자
=> 인자를 1개만 받는 생성자
 
 
*암시적 형변환
=> 컴파일러가 알아서 바꿔치기
int num = 1;
float f = num;  // 암시적
float g = (float)num; // 명시적
 
 
Knight(int _hp) : hp(_hp) { }
Knight k5;
k5 = 1; // Knight(int hp)
 
=> Knight(1) 의 생성자 를 호출하고 k5 에 복사 (대입)
즉, 1 이란 숫자는 Knight 가 될 수 있다.
 
void HelloKnight(Knight K)
{ cout << "HelloNight" << endl; }
 
HelloKnight(5);
 
해결책  :  explicit
=> '명시적인 용도' 로만 사용할 것
 
그렇다고 타입 변환 생성자가 바뀌는 것은 아니다.
따라서,
Knight k7 = (Knight) 1;
을 사용해 명시적으로 1 이란 정수를 Knight 로 형변환 가능.
 
 

 

 
*소멸자 ( Destructor )
=> 객체를 소멸할 때 호출되어짐.
~Knight( ) { }
 

본 내용은 인프런의 루키스님 강의를 듣고 정리한 내용입니다.

 

'프로그래밍 > C++' 카테고리의 다른 글

#41. 은닉성  (0) 2022.07.19
#40. 상속성  (0) 2022.07.19
#38. 객체지향의 시작  (0) 2022.07.19
#37. 파일 분할 관리  (0) 2022.07.19
#36. 2차원배열 &다중포인터  (0) 2022.07.19