목록서적 공부/게임 프로그래밍의 정석 (5)
Adaid's Workroom
간단하게 말하자면 참조는 기능을 제한한 포인터이다.참조와 포인터//만들때int& aRef = a;int* aPtr = &a;포인터는 &를 붙여서 주소로 만들어야 하지만 참조는 그럴 필요가 없다. //사용할 때aRef = 10;*aPtr = &a;포인터는 *를 붙여야 하지만 참조는 *을 붙이지 않아도 된다.차이1: 초기화 필요포인터는 무엇을 가리키는지 알 수 없는 것도 만들 수 있지만 참조는 반드시 무언가로 초기화해야한 한다.차이2: 가리키는 대상 변경 불가참조는 도중에 참조하는 대상을 변경할 수 없다.차이3: 첨자, 덧셈 사용 불가포인터는 배열에 접근하거나 숫자를 더해 다음 요소를 가리킬 수 있지만 참조는 불가능하다,참조의 유용한 점1. 반드시 뭔가 지정해야 하므로 초기화를 잊는 실수가 일어나지 않음2...
모든 변수는 거대한 배열인 메모리에 배치되어 첨자로 관리된다(memory[2]과 비슷한 식으로). 컴퓨터에서 메모리는 결국 char형 배열에 지나지 않는다. 변수와 배열, 구조체, 함수, 클래스 등은 모두 메모리 위에 놓여져 '몇 번 부터 몇 번까지는 어떤 변수'라는 표로 관리된다. 이 표를 임의로 만들어 주는 것이 컴파일러다.포인터이 메모리배열에서 첨자를 메모리 주소(memory address) 혹은 단순히 주소(address)라고 부른다. 그리고 이 첨자가 들어 있는 변수를 포인터(pointer)라고 부른다. C++ 포인터에서 사용하는 * 연산자는 포인터 변수를 첨자로 하여 메모리 배열에 접근하는 것이다. 모든 변수는 단순히 메모리 char 배열 중 어딘가를 빌려서 자리잡고 있는 것에 지나지 않는다...
게임에서는 bool형 변수를 여러 개 만드는 대신 unsigned형 변수 하나에 여러 플래그를 묶어 넣는 방법을 자주 사용한다.4바이트=32비트 크기인 unsigned형 변수 하나에는 플래그 변수를 32개 모아 둘 수 있다.또한 정수 변수에서 미사용한 부분을 플래그로 사용하는 경우도 있다. 플래그 저장플래그 클래스 예제 class Flag{bool check(인수 미정) const;void set(인수 미정);void reser(인수 미정);private:unsigned char mFlags;}; check 함수로 특정 플래스 상태를 조사하고set 함수로 특정 플래그를 온으로 하며reset 함수로 특정 플래그를 오프로 한다. 플래그 추출: 시프트 연산 이용우선 열거형을 숫자 그대로가 아니라 '2의 몇 승..
질문5. 멤버함수 선언 뒤 붙는 const가 뜻하는 의미를 아는가? 붙이는 조건을 설명할 수 있는가?6. operator 계열 멤버함수 사용법은 아는가? 직접 선언하고 사용할 수 있는가?7. enum을 클래스나 구조체처럼 사용할 수 있는지 알고 있는가? 활용할 수 있는가?8. delete와 delete[] 차이를 말할 수 있는가? 왜 두 종류가 있는지 설명할 수 있는가?9. C++ 문자열은 0 (NULL문자)을 종료 기호로 한다는 사실을 이해하는가? 보충5. 멤버함수에서 const멤버함수 뒤에 붙는 const는 '이 함수를 호출해도 클래스 멤버는 변경되지 않는다'고 컴파일러에 알리는 역할을 한다.그리고 만약 변수가 const인 경우에는 const가 붙어 있는 함수밖에 호출할 수 없다. class A {p..
질문1. using namespace std;가 뜻하는 의미를 아는가? 이름공간에 대해 설명할 수 있는가?2. templete 구문이 뜻하는 의미를 아는가? 최소한 만들어진 클래스를 사용할 수 있는가?3. 생성자, 소멸자에 대한 이해는 충분한가?4. 생성자에서 초기 설정 방법을 이해하는가? 스스로 사용할 수 있는가?보충1. 이름공간C++ 표준 라이브러리는 std 이름공간에 안에 들어 있다.std안에는 ifstream 클래스가 있는데 만약 당신이 이름이 같은 ifstream을 만들더라도 다른 이름공간에 넣어두면 구별할 수 있다. 매번 std::를 붙이기 귀찮으니 이를 편하게 하고자 using namespace 선언을 하는 것이다.이제부터 "std 이름공간에 있는 것을 사용한다"고 선언하는 것이 using ..