프로그래밍 74

#43. 초기화 리스트

*초기화를 왜 해야할까 ?? => 버그 예방 중요 => 포인터 등 주소값이 연루되어 있을 경우 Knight k; cout 멤버변수 선언 시, 바로 초기화 int _hp = 100; *생성자 내 vs 초기화리스트 => 일반 변수는 차이 없음. => 멤버 타입이 클래스인 경우 차이. public: int _hp; Inventory _inventory; => 이 경우, _inventory 가 선처리 영역에서 같이 만들어지게 됨. 이 때, Inventory 생성자 호출 만약 다른 생성자 호출을 생성자 내에서 하게 된다면, 위 그림처럼, call Inventory (0B512D0h) call inventory::Inventory (0B51366h ) 즉, 생성자가 두 번 호출되게 됨. 따라서, 클래스 타입의 멤버..

프로그래밍/C++ 2022.07.20

#42. 다형성 virtual

*virtual 로 선언된 함수를 자식에서 재정의했을때 자식클래스 vptr은 부모인가?자식에있는 함수인가?? => 당연히 자식에 있는 함수 포인터로 저장됨. => 마지막으로 재정의된 함수포인터를 가지고 있음. *부모클래스 선언시 vptr 이 생기나?? => 반드시 생김. virtual 함수가 존재하면 객체 생성 시, 생성자 이전 '선처리 영역' 에서 vftable offset 저장. => 각 객체마다 독립적인 vfptr 을 가지고 있음. *다형성 ( Polymorphism ) *오버로딩 => 함수의 이름을 재사용 *오버라이딩 => 함수를 재정의 *정적 바인딩 ( Static Binding ) : 컴파일 시점에 결정 => 일반적인 함수 * 동적 바인딩 ( Dynamic Binding ) : 실행 시점에 결..

프로그래밍/C++ 2022.07.19

#41. 은닉성

*Data Hiding / Encapsulation => 몰라도 되는 것은 깔끔하게 숨기겠다. *캡슐화 => 연관된 데이터와 함수를 논리적으로 묶어놓는 것 *왜 숨겨야하는가 ?? 1. 정말 위험하고 건드리면 안되는 경우 2. 다른 경로로 접근하길 원하는 경우 *접근 지정자 public / protected / private *상속 접근 지정자 => 부모한테 물려받은 유산을 꼭 나의 자손에게 똑같이 물려줘야하지 않음. public : 거의 public 을 씀. (public -> public , protected -> protected ) protected : ( public -> protected, protected -> protected ) private : ( public -> private , pr..

프로그래밍/C++ 2022.07.19

#39. 생성자 & 소멸자

*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 ) => 여러 개 존재 가능 *암시적 생성자 => 생성자를 명시적으로 만들지 않으면, 아무 인자도 받지 않는 [기본 생성..

프로그래밍/C++ 2022.07.19

#38. 객체지향의 시작

*객체지향 / 절차 지향 프로그래밍 *Knight 를 설계해보자. - 속성( 데이터 ) : hp, attack, position - 기능 ( 동작 ) : 이동, 공격, 죽음.. *Instantiate : 객체를 만든다!! (선언, 생성..) *멤버변수 / 멤버함수 *클래스 선언 시, 멤버함수는 메모리에 잡히지 않음. *struct & class 와 차이점 ?? => 접근 지정자 차이. 본 내용은 인프런의 루키스님 강의를 듣고 정리한 내용입니다. 강의 듣기 !!

프로그래밍/C++ 2022.07.19

#37. 파일 분할 관리

*header 파일 : 선언부 분리한 곳 *#include : 전처리문법 , 해당 파일을 복붙하는 기능 *pragma once : 중복된 선언 방지. #ifndef _TEST1_H__ => (정의되지 않았다면,) #define _TEST1_H__ => (정의를 해라. ) ~~~ #endif => #pragma once 와 비슷한 기능 하지만, 만약 같은 이름의 정의 (위에선 _TEST1_H__ ) 가 두 번 등장하게 되면 '한번' 만 적용됨. ( ifndef 이 통과되지 못함. ) *헤더파일은 최대한 간단하게 유지시키는게 중요. => 헤더파일에 #inlcude 는 피해야 좋다. => cpp. 에서 불러서 사용 #include 는 단순하게 그냥 [해당 내용을 그대로 복붙하겠다]는 의미 cpp에도 동일한 파..

프로그래밍/C++ 2022.07.19

#34. 다중 포인터

*다중포인터는 어떤 상황에 필요할까 ?? void SetMessage(const char* a) { a = "Bye"; } const char* msg = "Hello"; SetMessage(msg); cout "Hello" => 이유는 ?? a 는 함수내부의 복사본 , 복사본에 "Bye" 의 주소를 넣은 것이기 때문에 실질적인 msg 에는 영향이 없음. *그렇다면 어떻게 해야할까?? => 포인터의 포인터 즉, 포인터의 주소를 저장할 수 있는 포인터를 매개변수로 받는다. @.rdata Hello주소 => 리터럴 상수이기 때문 const char* msg = "Hello"; SetMessage(&msg); cout

프로그래밍/C++ 2022.07.19