전체 글
-
const 멤버 함수의 종류, const 함수내에서 수정가능한 경우@ 16. 1 ~ 17. 1/Effective C++ 2015. 12. 4. 00:31
멤버함수에 붙는 const 키워드 역활은 해당 멤버함수가 상수 객체에 대해 호출될 함수이다 라는 사실을 알려 주는 것이다. 이런 함수가 중요한 이유는? 1. 클래스의 인터페이스를 이해하기 좋게 하기 위한것. 그 클래스로 만등러진 객체를 변경할 수 있는 함수는 무엇이고, 또 변경할 수 없는 함수는 무엇인가? 사용자 쪽에서 알고 있어야 하는것.. 2. 이 키워드를 통해서 상수객체를 사용할 수 있게 하자 프로그램의 실행 성능을 높이는 핵심 기법 -> 상수 객체에 대한 참조자로 진행 * 실제 프로그램에서 상수 객체가 생기는 경우 1) 상수 객체에 대한 포인터 혹은 2) 상수 객체에 대한 참조자로 객체가 전달될때.. 단순 상수객체 변수의 상황은 거의 없다고 봐도 무방하다.. void print(const Test..
-
#define cosnt 상수변수로 바꾸기! operator[], const static, 클래스내 const, define 매크로@ 16. 1 ~ 17. 1/Effective C++ 2015. 12. 3. 21:02
const 키워드는 팔방미인이라는데.. 1. 클래스 바깥에서는 전역 혹은 네임스페이스 유효범위의 상수를 선언(정의)하는데 쓰고 const int a = 10; //헤더 파일 상단에..const 안붙이면 이곳저곳 헤더를 포함할때 난리남 2. static으로 선언한 객체에도 const을 쓸 수 있고 static const 이든 const static이든 똑같다 3. 포인터에는 포인터 자체를 또는 포인터가 가리키는 데이터를 상수로 지정할 수 있다. int* const ptr 또는 const int* ptr 둘차이는 *을 기준으로 보는데.. const int* ptr는 *기준왼쪽에 const이므로 포인터 가리키는 값 자체가 상수 /값변경불가능 주소변경가능 int* const ptr는 *기준 오른쪽에 const이..
-
소수점을 정수로 캐스팅 할때쥬신게임아카데미/궁금했던것 2015. 11. 26. 18:09
만약에 0.99를 정수로 캐스팅한다면 0이 되버린다. .99를 버리게 된다. 거의 1에 근접하니까..신경이 쓰인다 그래서 반올림을 하는데..0.6중 .6이 사라지는것보단 1이 되서 0.4를 더 얻는게 정확도면에선 더 낫지 않나..int Round(double _a) { //양수라면 0.5를 더하고나서 int로 캐스팅하고 소수점 아래는 버린다.. //음수라면 0.5을 빼야만한다. 그 이유는 int로 하는 캐스트는 0에 근접하는 방향으로 자르므로 //-4.4는 -5가 아니라 -4가 된다. -0.6은 0.5를 빼서 -1.1로 만들고 나서 잘라내면 된다. _a+=(_a > 0) ? 0.5 :-0.5; return static_cast(a); }
-
전방선언과 헤더파일 포함할때..쥬신게임아카데미/궁금했던것 2015. 11. 24. 01:49
중복된 헤더파일 포함에 대해선 아래 글부터 읽고 http://ekessy.tistory.com/20 전방선언 class A; 이런식으로 class B { public: A* ptr } B클래스 앞에 정의를 한다면 헤더파일을 포함하지 않고 포인터로 변수를 선언할 수 있는데.. 이게 중복된 인클루드를 피할 수가 있다.(A의 실제 헤더는 B.cpp에 포함해야한다) 만약에 #include"b.h" class A #include"a.h" class B가 있다면 보통은 중복을 안하려고 #pragma once를 붙이는데..(#ifndef ~ #endif나..) 그럼 #pragma once #include"b.h" class A {...} #pragma once #include"a.h" class B {..} 이렇게 ..
-
클래스 메서드와 데이터 멤버에 대한 포인터@ 16. 1 ~ 17. 1/C++ 2015. 11. 18. 19:26
함수포인터는 C++ 에서는 typedef로 선언해서 해당함수의 파라미터와 리턴타입에 호환되는 함수를 이용하면되는데.. typedef bool(*Func)(int, int); //Func 타입을 선언해서 두개의 int 파라미터와 bool타입 리턴값을 가지는 함수 포인터를 표현 Func func1; //선언한뒤에 bool test(int num1, int num2) {} //이런식의 함수가 있다면 func1 = test; 또는 포인터이니까 func1 = &test로 하면된다. C++11에서는 타입 에일리어스 기능이 있어 typedef bool(*Func)(int, int); 이걸 이렇게 using Func = bool(*)(int, int); 이런식으로 표현이 되며 Func func1; //똑같이 사용이 가..
-
난수, rand() 함수@ 16. 1 ~ 17. 1/C++ 2015. 11. 17. 19:25
나머지 기반 난수 발생기의 결점은 기본적으로 rand함수 때문에 생기는 것이다. rand함수는 20억 주기의 값들을 돌려주지만, 나머지를 적용하면 그 주기가 줄어든다. rand 함수가 생성한 수들의 하위 비트들에는 패턴이 존재하며, 그 패턴의 주기는 20억보다 훨씬 짧다. 그런데 나머지는 본질적으로 수의 상위 비트들을 잘라내므로 결과적으로 나머지를 통해 얻은 난수들의 주기가 원래의 난수들보다 훨씬 짧아지게 된다. 즉, 패턴이 좀 더 자주 반복되는 것이다. 패턴이 좀 더 나은 난수 생성기를 만들기 위해서는 하위 비트들이 아니라 상위비트들을 보존 활용해야한다. 나누기를 이용한 범위 결정 상위 비트를 보존 활용하는 가장 쉬운 방법은 나누기 연산자를 사용하는 것이다. number = ((6 * rand()) /..
-
퀵 정렬@ 16. 1 ~ 17. 1/알고리고리즘 2015. 10. 2. 23:35
거품, 힙 중에서 가장 빠른 알고리즘이다. 분할정복이라는 접근 방식을 이용해서 배열을 정렬하는 재귀적인 알고리즘이다. 1. 기준값 하나 선택 2. 그 기준값보다 작은 항목들을 배열의 왼쪽으로 3. 그 기준값보다 큰 항목들을 배열의 오른쪽으로 4. 왼쪽 부분 배열에 퀵 정렬을 재귀적으로 적용 5. 오른쪽 부분 배열에 퀵 정렬을 재귀적으로 적용 퀵정렬이 가장 효율적으로 작동하려면 두 부분배열들의 크기가 거의 비슷해야한다. 삼중앙 알고리즘을 쓰는데 첫 번째 중간 마지막 색인의 값들을 취해서 그 셋 중 가운데 값을 기준값으로 사용 11 10 16 4 8 12 1 6 0 20 2 9 5 이렇게 있을때 제일앞의 11 중간의 1 마지막의 5를 취하고 그중 가운데에 해당하는 5를 기준값으로 선정 기준값을 밖으로 뺀다 ..
-
힙 정렬@ 16. 1 ~ 17. 1/알고리고리즘 2015. 10. 2. 23:19
힙은 우선순위 대기열에 사용하기에 매우 효율적일 뿐만 아니라 효율적인 정렬 알고리즘으로도 쓰일 수 있다. 힙에서 흥미로운 점은 힙 자체에 정렬 기능을 가지고 있다. 힙의 특성은 항상 부모 노드가 자식 노드들보다 큰 값을 가진다는 것 이것을 정렬에 활용할 수 있다. 간단히 말해서 배열의 항목들을 모두 힙에 넣은 다음 한 번에 하나씩 힙에서 가장 큰 값을 뽑아 다시 배열에 저장하면 정렬된 배열이 만들어지는 것이다. 힙의 삽입 삭제 알고리즘 모두 O(log2n)이므로 효율도 좋다 그러나 단점이 있다. 필요한 공간이 두배로 늘어난다. 대량의 자료를 정렬한다면 문제가 된다. (옮겨야 하니까..뽑아서 옮기고 뽑아서 옮기고..) 공간 문제를 해결할 방법은 없는가? 무작위적인 자료가 담긴 배열을 힙으로 변환할 수 있다..