프로그래밍 언어/C++
C++ 친구 클래스 및 함수 (friend)
friend 클래스는 friend로 선언된 다른 클래스의 private 및 protected 멤버에 접근할 수 있다. 사용법은 friend 키워드를 사용하여 클래스나 함수를 명시 해 주는 것이다. 함수 같은 경우에는 전역함수랑 동일해진다, static 클래스 종속 함수랑은 별개. #include #include #include using namespace std; class A { friend class B; int mVal = 0; protected: void ProtectedFunc() { cout
C/C++ 연산자(Operator) 정리표 (비트, 논리, 산술 +=&^<<>>%~!)
논리 연산자(Logical operator) 연산자(Operator) 의미(Description) 예제(Example) && 모두 같으면 true를 return (a-3) && b || 하나만 true 면 true를 return a >3 || b > 오른쪽으로 비트 이동, 빈 곳은 0 x>>5
C++ POD, 표준 레이아웃 타입, 간단한 타입
POD (Plain Old Data) 메모리 상에서 연속적인 바이트 열이다. 다형성이나 유저가 정의한 복사 의미론 등과 같은 진보된 의미론 문법이 필요없을 때 개체를 POD로 취급해야 할 때가 있다. 왜냐하면, POD로 취급하면 하드웨어에서 좀 더 효율적으로 개체를 옮기거나 복사할 수 있기 때문이다. POD 개체는 다음 조건을 갖춰야 한다. 표준 레이아웃 타입(standard layout type)이어야 한다. 간단한 타입(trivial type)이어야 한다. POD가 될 수 있는 조건 복잡한 레이아웃을 갖지 않는다.(가상 함수 등) 유저가 정의한 복사 의미론을 갖지 않는다. 간단한 기본 생성자를 갖고 있다. 의 std::is_pod를 이용하면 쉽게 알 수 있다. 표준 레이아웃 타입 C와 분명하게 같은 ..
C++ namespace와 using
공동 작업 하다보면 네임스페이스로 나눠야 할 경우가 많다. namespace 네임스페이스 네임스페이스는 내부 식별자(형식, 함수, 변수 등의 이름)에 범위를 제공하는 선언적 영역이다. 네임스페이스는 코드를 논리 그룹으로 구성하고 특히 코드베이스에 여러 라이브러리가 포함된 경우 발생할 수 있는 이름 충돌을 방지하는 데 사용된다. 네임스페이스 범위에 있는 모든 식별자는 한정 없이 서로에게 표시된다. 네임스페이스 외부의 식별자는 각 식별자에 대해 정규화된 이름을 사용하거나, std::vector vec;단일 식별자에 대한 using Declaration(또는 네임스페이스using namespace std;(using std::string)의 모든 식별자에 대한 using 지시문을 사용하여 멤버에 액세스할 수 ..
C/C++ 전처리기의 모든 것 (예외, 매크로, 토큰)
전처리기 컴파일러는 사용자가 작성한 코드를 컴파일하기 전에 전처리문에서 정의해 놓은 작업들을 먼저 수행한다. 첫 문자는 항상 ‘#’으로 시작한다. ANSI 표준에 따른 C의 전처리문의 종류가 아래에 나와 있다. 파일 처리를 위한 전처리문 : #include 형태 정의를 위한 전처리문: #define, #undef 조건 처리를 위한 전처리문: #if, #ifdef, #ifndef, #else, #elif, #endif 에러 처리를 위한 전처리문: #error 디버깅을 위한 전처리문: #line 컴파일 옵션 처리를 위한 전처리문: #pragma #include 꺽쇠 괄호 솔루션 파일이 위치한 폴더가 아닌 타 폴더에 있을 시, 쌍 따옴표는 " " 같은 폴더에 있을 시 // 타 폴더 #include #inclu..
C++ 연산자 오버로딩
좌측 값 그대로 변경된 상태에서 반환 시 불필요한 복사 방지하기 위해 무조건 & 레퍼런스로 반환할 것. #include #include #include #include using namespace std; class Test; bool SAFETY_CHECK(Test& t) { if (&t == NULL) { cout
RAII (Resource Acquisition Is Initialization)
RAII는 Resource acquisition is initialization의 약자로 C++설계 패턴중 하나인 키워드이며 흭득된 자원을 초기화 한다. 동적인 프로그래밍을 위해 new라는 키워드를 사용해 힙 메모리에서 할당받는다. 할당 받는순간 해당 메모리의 resource를 프로그래머는 직접 관리하게 된다. 예기치 못한 exception등... 다양한 이유로 인해 할당받은 메모리를 해제하지 못하고 Memory leak이 발생하게 된다. 뿐만 아니라 mutex의 lock에서도 발생할 수 있다. 이러한 문제들을 안전하게 관리하고자 만든 것들이 unique_ptr, shared_ptr, lock_guard 등...이 있다. 해당 클래스들은 함수가 끝나면, {}(중괄호)에서 벗어 난다면.... finally..
C++ virtual 다중 상속, 가상 부모 클래스
다중 상속을 할 시 예상치 못하게 클래스가 중복될 가능성이 있다. class A { public: int a; }; class B : public A { public: int b; }; class C : public A { public: int c; }; class D : public B, public C { public: int d; }; A 클래스를 B, C 클래스가 상속받고 B, C 클래스를 D클래스가 상속받는 구조다. 문제는 이와같은 구조로 상속받을 때 A클래스의 내용물이 중복이 된다 하지만 중복되는 걸 희망하지 않을 때는 virtual 상속을 사용하면 된다. 클래스를 상속받을 때 상속받는 클래스에 virtual 을 앞에 붙여주면 된다 그렇게 되면, B, C 클래스를 상속받는 경우 B, C 클래스..
C++ _if STL 알고리즘 함수 (파라미터 _Pr _Pred) > 조건자 (Predicate)
참고할만한 부분은 _if로 끝나는 함수들만 매개변수(조건자)로 넘길 수 있다는 점, sort 함수 예외. 참고 사이트 : https://en.cppreference.com/w/cpp/algorithm #include #include #include #include #include using namespace std; bool Is_one(int _val) { return _val == 1; } class Test { public: bool operator()(int i) { return i % 4 == 0; } }; struct s_test { public: bool operator()(int i) { return i % 2 == 0; } }; int main() { // 파라미터 _Pr _Pred > ..
C++ 구조적 바인딩 (Structured Bindings)
C++17부터 지원하는 structured binding이란 어떤 배열, STL 같은 컨테이너에서 멤버들을 쉽게 바인딩할 수 있도록 도와주는 문법이다. 친숙한 std::map을 예시로 바인딩을 해보자. #include #include int main() { std::map mp; for (int i = 1; i < 11; i++) { mp[i] = i * i; } // iterator, basic for for (std::map::iterator it = mp.begin(); it != mp.end(); it++) { std::cout first