목록프로그래밍/C++ (10)
有希
출처: https://yonmy.com/archives/9 YonMy » std::map(set) insert 정확하게 사용하기 꽤나 많은 프로그래머들이 std::map insert 의 사용을 잘 못 하고 있는 경우가 있어서, 오늘은 그것에 대해 이야기 하려고 한다. 우선 std::map의 insert의 기본형을 보면 다음과 같다. pair inser yonmy.com 나나 다른 사람들의 코드를 보면 대부분 이렇게 쓰고 있다. std::map temp; auto itr = temp.find(1); if (itr == temp.end()) { temp.insert({ 1, "number 1" }); } else { itr->second = "number 1"; } 1. 우선 find 2. 찾지 못했다면 i..
동적 배열을 통해서 구현된다 -> 배열의 크기를 유동적으로 조절한다 1. 쓸 만큼보다 더 많이 메모리를 할당한다. 2. 여유분까지 다 썼으면 메모리 증설. 책에서는 2배라고 읽었었는데, VS에서는 1.5배로 증설해주고 있다. 증설 과정: 1.5배 사이즈의 배열을 하나 더 만들고->기존 배열의 데이터를 복사->기존 배열은 삭제한다. vector v; v.size() = 실제 사용 데이터 개수 v.capacity() = 여유분을 포함한 최대 개수 v.resize(int) = size를 조정한다. capacity가 모자라면 capacity도 늘린다. vector v(1000, 0); //resize 1000 하고 데이터 들을 0으로 초기화 한 것과 같은 선언 vector v2 = v; //size capaci..
1. static_cast 타입 원칙에 비춰볼 때 상식적인 캐스팅만 허용 int->float, 부모->자식 등.. int hp = 100; float maxHp=200; float ratio = static_cast(hp)/maxHp; 2. dynamic_cast 상속 관계에서의 안전한 형변환 RTTI(RunTime Type Information). 다형성을 활용하는 방식 -> virtual 함수가 존재해야 한다. vftable을 이용해서 항상 원본 클래스를 추적하고 있어서 옳지 않은 클래스로 cast를 하려고 한다면 nullptr이 반환된다. 아래 예시에서는 nullptr이 반환된다. Creature *c = new Dog(); Dog *d = dynamic_cast(c); 다만, static_cast..
1. 타입 변환 생성자 Dog(const Cat& cat) { _age = cat.GetAge(); } //이런 클래스간 변환이 가능하다 dog = (Dog)cat; 2. 타입 변환 연산자 operator Cat() { return (Cat)(*this); } Cat cat = dog; 가 가능 3. 참조 타입 변환 명시적인 변환은 가능하다, 암묵적인 변환은 불가능 하다 Cat cat; Dog& dog = (Dog&)cat; //가능 Dog& dog = cat; //불가능 4. 상속 관계에 있는 클래스 간의 변환 1. 값 타입 변환 부모는 자식으로 절대 변환할 수 없다. 자식은 부모로 변환 가능. 2. 참조 타입 변환 부모->자식은 명시적만 가능 자식->부모는 둘 다 가능 정리 값 타입 변환: 비트열도 ..
malloc/free 원하는 만큼의 메모리를 할당 받을 수 있다. 함수임 new/delete 딱 정해진 만큼의 메모리만 받을 수 있다. 사용성은 훨씬 편함. 연산자임 중요한 차이점: new/delete는 생성자/소멸자를 호출한다.
1. 실행할 코드가 저장되는 영역 -> 코드 영역 2. 전역/정적 변수 -> 데이터 영역 3. 지역 변수/매개 변수 -> 스택 영역
게임에서 플레이어가 캐릭터를 고른다고 하면 이 녀석들의 토대인 Character 라는 클래스가 있을 것이고 이를 상속받은 거너, 법사, 격투가 등의 클래스가 있을 것이다. 그런데, 플레이어가 Character라는 클래스를 선?택 한다는 일은 있을 수 없다. 반드시 하위 클래스들 중 1개를 선택하여 플레이해야 하므로 Character라는 녀석을 인스턴스화 시킬 수 없도록 해야한다. 이를 위한 것이 순수 가상 함수 이다. 함수를 다음과 같이 선언한다. virtual 반환형 함수명(매개변수) = 0; 이렇게 하면 순수 가상 함수가 포함된 클래스는 추상 클래스가 된다. Character 자체로는 구현될 수 없고, 상속받은 녀석(거너)이 순수 가상함수들을 모두 재정의 하고 나서야 거너를 생성할 수 있게 된다.
바인딩 함수 호출할 때 어떤 주소에 있는 함수를 호출해야 하는지 컴파일 시 이어주는 단계. 일반함수는 정적 바인딩을 사용한다. -> 컴파일 시점에 결정 가상함수는 동적 바인딩을 사용한다. -> 실행 시점에 결정 부모가 한 번 virtual 선언을 하면 자식에 있는건 다 virtual이다. Player가 있고 이를 상속받은 Knight가 있다고 할 때, Player* player를 매개변수로 받는 PlayerMove 함수에 Knight를 넣는다. PlayerMove 함수에서는 player->Move() 함수를 실행시킨다. Move를 virtual로 지정하지 않으면 Player의 Move가 실행되고 Move를 virtual로 지정하면 상속받은 Knight의 Move가 실행된다. 즉, 부모의 함수에 virtu..
1. 상속성 2. 은닉성(캡슐화) 1. public 2. protected 3. private 3. 다형성 1. Overloading 함수 이름 재사용. (인자가 달라진다) 2. Overriding 부모 함수 재정의