프로그래밍 언어/C++

    C++ if/switch statement with initializer

    0. 서문 지금까지의 C++에서 if 또는 switch의 평가식에 사용되는 변수는 미리 선언되고 적절히 초기화된 상태여야 한다. std::map에 원소를 추가하고 이에 대한 예외 처리를 하는 아래 예제가 일반적인 샘플이라 할 수 있다. #include #include int main() { std::map map; map["hello"] = 1; map["world"] = 2; // 일단 insert를 수행하고 결과 pair를 반환받아야 한다. auto ret = map.insert({ "hello", 3 }); // 그러고 나서, pair의 2번째 요소를 체크 if (!ret.second) std::cout

    C++ 모듈 (Module)

    정의 기존의 #include 방식인 Translation Unit 방식과는 다른, 별개와 컴파일되는 소스 코드 파일의 집합이다. Header파일을 사용하면서 생겨나는 많은 문제를 제거하거나 줄이고, 컴파일 시간을 단축하기도 한다. 선언된 모든 매크로, 전처리 지시문과 export 하지 않는 이름(names)들은 표시되지 않으며, 컴파일 할 때 영향을 주지 않는다. 또한 순서에 관계 없이 가져올 수 있다. (include, import) Module을 한 번 컴파일한 후에는 export된 모든 형식(Type), 함수 및 템플릿을 이진파일에 저장한다. 이 파일은 이전의 헤더 파일들보다 훨씬 빠르게 처리될 수 있다. 기존의 C++ 빌드 과정 C++ 프로그램의 빌드 과정은 전처리, 컴파일, 링크로 구성된다. 전..

    C언어로 객체지향 주 4개의 요소 (추상화,다형성,상속,캡슐화) 구현하기

    추상화 (클래스) 비슷하게 생긴 Cpp과 C를 비교해보자. Cpp는 class를 이용해서 class에서 사용할 상태와 메서드들을 선언할 수 있다. 반면 C의 struct에서는 오직 상태만을 저장할 수 있다. 일반적으로 C에서 struct에 관한 함수들을 작성한다면, 이름으로 특정 구조체와 관련된 함수임을 나타낸다. 예를 들어 x, y, width, height를 변수로 가지는 Rect라는 구조체가 있다면, 아래와 같이 파일을 작성하는 것이 일반적이다. /* rect.h */ struct Rect { unsigned int x; unsigned int y; unsigned int width; unsigned int height; }; void rect_move(struct Rect *rect, unsign..

    C++ call by value, call by reference

    1. 예시 코드 주요 설명 명칭 설명 vector vec main 함수에서 선언한 int형 vector void modifyVector(vector vec) call by value 방식으로 vec의 원소 값을 받는 함수 void modifyVector(vector &vec) call by reference 방식으로 vec의 주소 값을 받는 함수 vec.size() vec의 크기를 반환하는 멤버변수 unsigned int형으로 반환 vec.at(정수형 인덱스) vec에 정수형 인덱스에 해당되는 원소 값을 반환 vec.push_back(정수) vec의 마지막 원소 뒤에 정수 값을 추가 2. call by value #include #include using namespace std; void modifyV..

    C++ (template, auto, decltype) 타입 추론 Universal reference

    1. 정의 C++11의 새로운 피쳐들 중에서 아마 가장 의미있는 것은 RValue reference일 것이다. 이로 인해 move semantics와 perferect forwarding이 가능해졌기 때문이다. 문법적으로 &&(ampersands) 2개를 붙여 표시한다. void f(widget&& param); 위 예제를 보면 rvalue reference를 &&로 표기하는데 아무런 문제가 없어보인다. 하지만, 다음의 예제들은 &&로 rvalue reference를 의미할수도 그렇지 않을 수도 있다. Widget&& var1 = someWidget; // rvalue ref auto&& var2 = var1; // rvalue ref or lvalue ref (universal ref) template..

    C++ 공용체(union) 개념과 통신에서의 사용 이유

    union 정의 union은 struct와 유사하지만 union의 변수 중 가장 큰 변수의 메모리를 모든 변수가 공유한다는 점에서 다르다. 같은 변수를 가지는 struct와 union의 size를 출력해보면 아래와 같이 결과가 다른것을 확인할 수 있다. typedef struct sizeTest_struct { int a;// 4byte double b;// 8byte }sizeTest_struct; typedef union sizeTest_union { int a; double b; }sizeTest_union; int main() { sizeTest_struct s; sizeTest_union u; printf("struct size : %d\r\n", sizeof(s));// 16 printf("u..

    C++ struct(구조체), union(공용체) 크기에 대한 정리

    1. struct Struct(구조체)는 구조체 멤버중 가장 큰 변수의 크기를값을 기준으로 잡고 기준값의 크기에 나머지 변수를 순서대로 차곡 차곡 배치하여 구조체의 전체 크기가 결정 된다. 아래의 예시 코드를 보자. typedef struct test{ int a; long c; char b; char d:1, //d:1의 의미는 char d를 1bit 의 크기로 계산하고 사용한다는 의미 e:1, f:1, g:2, i:1, k:1; long h; } test; int main(void) { test k; k.g=1; // printf("a:%d \n",k.g); printf("size : %d\n",sizeof(k)); return 0; } 구조체 형태 도식화 (long 은 64bit 운영체제에서 8by..

    C++ 함수 객체 (Functor) / () 연산자 오버로딩

    추가 글 : 함수 객체 (Fuction Object) 템플릿 / 람다식 — A Game Client Programmer (tistory.com) 함수 객체 (Fuction Object) 템플릿 / 람다식 장점 : 다른 멤버 변수와 멤버 함수를 가질 수 있고 일반 함수에서 하지 못하는 지원을 받을 수 있습니다. 함수 객체의 서명이 같더라도 객체 타입이 다르면 서로 전혀 다른 타입으로 인식합니다 devshovelinglife.tistory.com 콜백 메커니즘 개념을 설명하기 위해선 '서버 코드'와 '클라이언트 코드'의 개념이 필요하다. 서버 코드: 기능이나 서비스를 제공하는 코드 클라이언트 코드: '서버 코드'가 제공해주는 기능이나 서비스를 사용하는 코드 Print() 함수는 출력 기능을 제공하는 '서버 ..

    C++ 클래스 접근제한자 관련 보충 내용

    클래스 접근제한자는 오브젝트 레벨이 아닌 클래스 레벨로 작동되기 때문에 생성자 내에서 파라미터로 받는 같은 클래스 변수의 private 또는 protected 멤버 변수에 접근이 가능하다. #include using namespace std; class A { private: int mValue = 0; public: A() = default; A(int val) : mValue(val) { } A(const A& a) { this->mValue = a.mValue; } void Print() { cout

    C++ 객체 이동 std::move

    에 정의됨 // C++ 14 이전에는 constexpr 아님! template constexpr typename std::remove_reference::type&& move(T&& t) noexcept; std::move 는 어떤 객체 t 가 이동 될 수 있음 을 알려준다. 이동 이라 하면 C++ 11 에 도입된 개념으로 t 가 가지고 있는 자원을 다른 객체에게 효율적으로 전달하는 것을 의미한다. std::move 된 객체를 함수에 전달한다면, 우측값 레퍼런스를 인자로 받는 함수(예를 들어서 이동 생성자, 이동 대입 연산자, vector 의 push_back 함수 같은 애들)가 오버로딩 되어서 선택된다. 참고로 우측값 레퍼런스 자체는 rvalue 가 아니라 lvalue 이기 때문에, 이동 생성자나 이동..