C++ R-Value를 이용한 이동 대입L-Value를 이용해서 밑에와 같이 간단한 프로그램을 만들었다고 치자. main.cpp#include "Resource.h" #include "AutoPtr.h" #include "Timer.h" AutoPtr generateResource() { AutoPtr res(new Resource(10000000)); return res; } int main() { Timer timer; { AutoPtr main_res; main_res = generateResource(); } timer.elapsed(); } AutoPtr.h#pragma once #include template class AutoPtr { T *m_ptr; public: AutoPtr(T *pt..
C++ 메모리 누수 체크하기C++에서 프로그래머가 예상치 못하게 메모리 누수를 체크 못하는 경우가 있다.이럴 경우를 대비해서 메모리 누수 체크를 해보자. #include #include // _CrtDumpMemoryLeaks() 사용하기위해 #if _DEBUG #define new new(_NORMAL_BLOCK, __FILE__, __LINE__) #define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__) #endif // 몇행에서 메모리 누수가 나는지 알려줌. using namespace std; int main() { int *a = new int; _CrtDumpMemoryLeaks(); // 메모리 누수 체크 return 0; }먼..
C++ override, final, 공변 반환값override 키워드#include using namespace std; class A { public: virtual void print(int x) { cout
C++ 상속 받은 함수 감추기부모 클래스에서 자식 클래스 상속을 했을 때 부모 클래스에 있는 멤버 변수를 자식 클래스에서 마음대로 변경을 하고 싶으면 어떻게 해야 될 까?? 부모 클래스 멤버 변수를 public 으로 선언을 한다던지 protected로 선언을 해서 자식 클래스에서 마음대로 변경을 한다던지 여러가지 방법이 있다. #include using namespace std; class Base { protected: int m_i; public: Base(int value) : m_i(value) {} void print() { cout
C++ assert와 static_assert 우리는 프로그램을 만들 때 디버깅 시간이 많이 걸리게 된다.디버깅을 할때도 컴파일러 도움을 받는다면 디버깅이 더욱 더 쉽고, 시간이 적게 들 것이다. 사용법은 간단하다.일단 assert()에 대해서 알아보자.assert는 런타임(실행중)중에만 된다. #include #include // assert.h using namespace std; int main() { assert(false); return 0; }먼저 이렇게 하고 assert가 어떻게 동작을 하는지 알아보자. 이렇게 7행에 오류가 있다고 런타임 에러(runtime error)가 뜬다. 디버깅 모드에서는 _DEBUG가 정의 되어있으면 assert가 동작을 하고 Release 모드에서는 NDEBUG가..
C++의 explicit 키워드는 뭘 하는 건가요?C++컴파일러는 함수의 인자로 들어오는 값을 알아서 타입에 맞게 바꿀 수 있습니다. 이게 무슨 뜻인지는 다음의 예제로 설명할게요. class Foo{ public: int m_foo; Foo (int foo) : m_foo (foo) {} }; void printM_foo (Foo foo){ cout
C++ std::tuple 함수 반환값을 여러개 리턴하기 보통 함수를 사용하게 되면 반환값은 하나만 나오게 되어 있다.근데 C++17에서는 std::tuple 이라는 것이 나왔으며 tuple 사용하게 되면 반환값을 여러개 리턴할 수 있다. std::tuple을 사용하지 않고 struct를 사용해서 여러개 받을 수 있지만 tuple을 사용해보자.#include #include using namespace std; std::tuple getTuple() { int a = 10; double d = 3.14; return std::make_tuple(a, d); } int main() { std::tuple my_tp = getTuple(); cout
C++ std::vector 동적배열 대체 vector는 동적할당 해주는 기능을 가지고 있다.그리고 우리가 동적할당 할때 우리가 직접 new해서 힙에 메모리 주소를 받아오고사용이 끝나면 delete를 해줘야 한다는 불편함이 있다. 근데 vector는 이런 기능이 포함되어있고 자기가 알아서 delete를 해준다. #include #include using namespace std; int main() { int *my_arr = new int[5]; delete[] my_arr; std::vector arr2 = { 1,2,3,4,5 }; cout
C++11 std::array 정적 배열 대체 우리가 보통 배열을 선언을 하면int arr[] = {1,2,3,4,5} 이렇게 선언을 한다.이렇게 선언할시에 우리가 [] 괄호 안에 num을 안써줘도 컴파일러 알아서 메모리를 잡아준 다는 것이다. 우리가 이번에 할 것은 C++11에서 std::array 라는 것이다.std::array를 쓸 경우 더 편하고 안정성 있게 사용할 수 있다. 코드를 보면서 이해해 보자. 12345678910111213141516171819202122232425#include #include using namespace std; void printLength(array &my_arr){ cout
주어진 집합에 모든 집합 찾기 알고리즘 원소 {a, b, c}가 있다면 {a}, {b}, {c}, {a b}, {a c}, {b c}, {a b c} 이렇게 모든 집합을 찾고 싶다. 이것을 C++로 표현을 해보자. 1234567891011121314151617181920#include using namespace std; void printSubsets(char set[]){ int n = 3; for (int i = 0; i
C++ ()연산자 오버로딩과 펑터(Functor) () 연산자를 오버로딩을 하게 되면 객체를 함수처럼 사용할 수 있게 된다. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546#include using namespace std; class Point{ int xpos, ypos;public : Point(int x = 0, int y = 0) : xpos(x), ypos(y) {} Point operator+(const Point &pos) const { return Point(xpos + pos.xpos, ypos + pos.ypos); } friend ostream& operator
C++ 가상함수(virtual) 12345678910111213141516171819202122232425262728#include using namespace std; class Base{public: void OutMessage() { cout