CPP 48

header

기본 개념 1. header 파일 예시 예를들면, test.h 라는 헤더 파일이 있고 안에 namespace { class { function } }이 있다하자. 여기서 어떻게 동작하는지와 같은 자세한 내용은 작성하지 않는다. 즉, 틀만 작성한다. // test.h namespace N { class test { public: void function(); private: int value = 0; }; } 2. .cpp 파일 예시 이제 test.cpp 파일을 만들고 #include "test.h"로 컴파일러에게 test.h에 정의된 내용을 알려준다. header 파일에 틀을 작성했다면, .cpp 파일에는 틀이 어떻게 동작하는지 작성해주면 된다. header 파일에서 function의 기능을 작성하지 않..

cpp Modern C++ delete

delete ( 삭제된 함수 ) 특정 함수를 사용하고 싶지 않을 때 이용한다. 컴파일러가 기본적으로 제공하는 함수도 포함한다. class Player { public: void operator=(const Knight& k) = delete; private: // delete가 없었을 때 특정 함수를 막는법 // 정의되지 않은 비공개 함수 void operator=(const Knight& k); // 복사 연산자 막기 } 출처 https://www.inflearn.com/course/%EC%96%B8%EB%A6%AC%EC%96%BC-3d-mmorpg-1/dashboard [C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 - 인프런 | 강의 시리즈를 원활하게 ..

cpp Modern C++ enum class

enum 살펴보기 enum PlayerType { PT_Knight, PT_Archar, PT_Mage }; enum MonsterType : char { MT_Slime = 5, MT_Skeleton }; 첫 번째 원소의 기본값은 0이다. 다음 원소로 갈 수록 1씩 증가한다. enum은 기본적으로 int형이다. enum의 원소들의 이름이 { } 영역 내에서만 동작하는 것이 아니라 전역으로 퍼질 수 있다. 따라서 unscoped enum이라 부른다. 각 원소를 사용할 때 int형으로 인식한다. enum class enum과 달리 scoped enum이다. { } 영역 내에서만 변수 이름이 활동한다. 사용하는 이유는 간단하다. 이름공간 관리에 이점이 있다. 암묵적인 타입 변환이 금지된다 여기서 2번은 상황..

cpp Modern C++ using

using typedef을 확장한 것이다. typedef을 사용한 이유 자료형의 이름이 너무 길 때 자료형이 정확히 정해지지 않았을 때 // 1 typedef vector::iterator Vecit; // 2 typedef int id; // 나중에 __int64, unsigned int 등 변할 여지가 있다. using을 사용하는 이유 typedef을 사용하는 이유 typedef보다 직관성이 뛰어나다 typedef은 템플릿을 이용할 수 없다. // 2 using ID = int; typedef void (*MyFunc)(); using MyFunc = void(*)(); // 3 template using List = std::list; // typedef가 템플릿을 이용하려면 2단계를 거친다. te..

cpp Modern C++ 중괄호 초기화

중괄호{ } 초기화 초기화 방식을 통일 시키고 축소 변환을 방지하는데 의미를 둔다. 여러가지 초기화 방식을 살펴보자. class MakeClass { public: }; int a = 0; int b(0); int c{ 0 };// 중괄호 초기화 MakeClass mc; MakeClass mc2 = mc;// 복사 생성자 MakeClass mc3{ mc2 }; 중괄호 초기화는 컨테이너와 잘 어울린다. // vector 기존 초기화 방법 vector v1; v1.push_back(1); v1.push_back(2); vector v2(3, 1); // 중괄호 초기화 vector v3{ 1, 2, 3, 4 }; 배열 초기화 방식처럼 벡터를 초기화 할 수 있다. 축소 변환 방지는 데이터 유실을 방지하는 것이다..

cpp Modern C++ auto

auto type deduction(타입 추론) 해준다. 값을 보고 type을 추론한다. 추론 규칙은 복잡하기 때문에 중급자 이상일 때 알아보는걸 추천한다. int i = 3; float f = 3.14f; double d = 45.32; MakeClass mc = MakeClass(); const char* word = "hello"; auto i = 3; auto f = 3.14f; auto d = 45.32; auto mc = MakeClass(); auto word = "hello"; auto를 사용할 때 주의할 점은 const와 &을 무시한다는 점이다. int a = 3; int& ref = a; const int cst = a; auto test1 = ref;// auto -> int auto..

cpp algorithm 라이브러리

#include 알고리즘을 이용하면 코드의 가독성이 좋아진다. 왜냐하면 cpp을 사용하는 사람들이 자주 사용하는 기능을 담고 있기 때문이다. 똑같은 기능을 구현할 때, 알고리즘을 사용한 코드는 다른 사람들이 어떤 기능인지 빠르게 파악할 수 있다. 하지만 개인이 직접 구현한 코드는 사람마다 해당 코드가 어떤 기능을 하는지 파악하는 시간이 다르다. 수많은 알고리즘 중에서 자주 사용하는 알고리즘을 알아보자. // 기본코드 srand(static_cast(time(nullptr))); vector v; for (int i = 0; i < 100; i++) { int num = rand() % 100; v.push_back(num); } find(), find_if() 특정 숫자가 벡터에 있는지 체크하는 기능을 ..

cpp STL 기타 연관 컨테이너

set key만 저장한다는 것을 제외하면 map과 유사한 방식으로 사용한다. #include set s; s.insert(10); s.insert(30); s.insert(20); s.insert(40); s.erase(40); s[4] = 50;// 지원하지 않는다. multimap, multiset 중복 key를 허용한다. 중복 key를 사용할 일이 거의 없기 때문에 잘 사용하지 않는다. multimap mm; multiset ms; mm.insert(make_pair(1, 100)); mm.insert(make_pair(1, 200)); mm.insert(make_pair(2, 300)); mm.erase(1);// key=1은 전부 삭제 mm[1] = 500;// 지원하지 않는다. // ms와 사..