프로그래밍 언어/C & C++ 정리 99

템플릿의 특수화

암시적 구체화 암시적 구체화를 사용하는 이유는 말 그대로 암시적인 제한성 때문인데, 즉 사용하기를 원하는 데이터형을 나타내는 하나 또는 그 이상의 객체를 선언하기 때문이다. ArrayTP stuff; // 암시적 구체화 컴파일러는 객체가 요구될 때까지 그 클래스의 암시적 구체화를 생성하지 않는다. ArrayTP *pt; // 포인터, 아직 객체가 필요 없다. pt = new ArrayTP ; // 이제 객체가 요구된다. 두 번째 구문은 컴파일러에게 하나의 클래스 정의와, 그 정의에 따라 생성되는 하나의 객체를 생성하라고 지시한다. 명시적 구체화 키워드 template을 사용하여 클래스를 선언하고, 사용하려는 데이터형을 나타냈을 때, 컴파일러는 명시적 구체..

복사 생성자 & 복사 대입 연산자 & explicit & extern

explicit 키워드는 자신이 원하지 않은 형변환이 일어나지 않도록 제한하는 키워드이다. extern 키워드는 전역 변수, 함수 또는 템플릿 선언에 적용할 수 있다. extern 키워드는 컨텍스트(문맥)에 따라 네 가지 의미가 있다. 1. 전역 const 변수가 아닌 선언에서 변수 또는 함수가 다른 변환 단위에 정의되도록 지정한다. 변수가 정의된 파일을 제외한 모든 파일에 extern적용해야 한다. 2. const 변수 선언시, 변수에 extern 링크가 있음을 명시해야한다. 모든 선언된 파일에서 extern 은 반드시 선언되어야한다(Global const 변수는 기본적으로 내부 연결을 가진다.) 3. c언어에서의 extern은 한정자 또는 블록의 여러 함수 선언에 적용될 수 있다. 4. 템플릿 선언 ..

C++ STL Pair & Map

Pair Pair 란? pair 클래스는 사용자가 지정한 2개의 타입의 데이터를 저장하는 데 사용한다. 서로 연관된 2개의 데이터를 한 쌍으로 묶어서 다룰 때 사용하면 편리하다. 만약 pair 클래스를 사용하지 않고 코드를 짜야 한다면, 서로 연관된 2개의 데이터를 다룰 때, 구조체를 따로 정의해야 한다. 여간 번거로운 일이 아니기에 pair 클래스를 이용함으로써 서로 다른 2개의 연관된 2개의 데이터를 편리하게 관리가 가능하다. Pair의 헤더파일 pair 클래스는 #include 라는 헤더파일에 존재하는 STL이다. 그러나 다음 헤더파일들은 utility 헤더 파일을 포함하는 헤더 파일이다. #include // utility 헤더파일이 포함됨. #include // utility 헤더파일이 포함됨...

C++ STL) deque란?

deque( double ended queue ) 양쪽에서 끝나는 que(큐)를 줄여서 '데크'라고 불린다. stack의 경우엔 최상단에서 삽입, 삭제가 일어나지만, queue같은 경우는 한쪽에서 삽입, 반대쪽에서 삭제가 일어난다. (한쪽 입구에서 삽입, 삭제 중 하의 기능만 가능) deque 의 클래스는 선형 배열로 지정된 형식의 요소를 정렬하고 벡터와 같이 모든 요소에 대한 빠른 임의 액세스를 허용하고 컨테이너 뒷면에서 효율적인 삽입 및 삭제를 허용하는 시퀀스 컨테이너의 클래스 템플릿이다. 이러한 특성은 스택과 큐를 합친 기능으로 모든 입구에서 삽입 삭제가 가능하다. 구조 stack의 경우엔 LIFO(Last In First Out) deck의 경우엔 FIFO(First In First Out) de..

OBB 충돌

OBB 충돌 체크 알고리즘 설명이다. 이 설명은 벡터를 다룬다. 벡터와 벡터의 내적을 모르면 이해하기가 어려울 수 있다. AABB와 OBB는 직사각형 모양의 Bounding Box를 이용해 객체들이 충돌했는지를 판단한다. AABB는 Axis Aligned Bounding Box의 약자로, 축 방향으로 정렬된 경계 경계 상자(Bounding Box)를 뜻한다. 2차원으로 생각했을 때, 모든 변이 x, y 축에 평행한 직사각형을 경계 상자로 정해 충돌 체크를 한다. 반면, OBB는 Oriented Bounding Box의 약자로, 방향성이 있는 경계 상자(Bounding Box)를 뜻합니다. 2차원으로 생각했을 때, 회전이 있는 (회전이 된) 도형을 경계 상자로 정해 충돌 체크를 합니다. (이 글에서는 2차..

생성자를 통한 자동 형변환, 변환 함수

생성자를 통한 자동 형변환 생성자를 자동 데이터형 변환 함수로 동작하게 하는 것은 멋진 기능처럼 보이지만, 프로그래머들이 C++를 많이 경험하게 되면, 자동 데이터형 변환이 항상 바람직한 것은 아니라는 것을 알게 된다. 되려 예상치도 못한 부작용을 일으킬 수도 있다는 프로그래머들은 알게 될 경우도 있다. 그래서, 최신 C++ 시스템에는 자동 데이터형 변환을 못하게 하는 explicit라는 새로운 키워드가 추가되었다. explicit Stonewt (double lbs);// 암시적 데이터형 변환을 허용하지 않는다. 위 예제와 같이 생성자에 explicit 앞의 예와 같은 암시적 데이터형 변환을 못하게 막는다. 그러나 다음과 같은 명시적 데이터형 강제 변환은 여전히 허용한다. 즉 explicit 는 암시적..

분할 컴파일

헤더 파일과 cpp 파일을 구분해놓지 않으면 여러모로 번거로운 일이 생긴다. 예를 들어서, 두 개의 지원 함수를 하나의 별도의 파일에 넣었다고 가정한다면, 양쪽 파일에 있는 그 함수 모두 그 구조체 선언을 사용하기 때문이며, 일일이 번거롭게 그것들을 직접 타이핑하면 실수를 저지를 위험도 있을 뿐만 아니라, 변경할 일이 생기면 둘 다 변경해 주어야 한다. 쉽게 말해서, 하나의 프로그램을 여러 파일에 펼칠 때에는 새로운 문제가 발생한다. 그러므로 원본 프로그램을 다음 과 같이 세 부분으로 분할할 수 있다. 분할 기준은 다음과 같다. 구조체 선언과, 그 구조체를 사용하는 함수들의 원형이 들어 있는 헤더 파일 = .h 그 구조체에 관련된 함수들의 코드가 들어 있는 소스 코드 파일 = .cpp 그 구조체에 관련된..

L-Value R-Value

L-Value는 간단히 말하자면 식별 가능한(즉, 주소가 있는) 메모리에 위치한 객체이다. 1. 모든 구문에서 할당되었을 때, "L-Value"는 반드시 데이터를 저장할 수 있는 기능을 가져야 한다. 2. L-Value는 반드시 함수나, 식 ( a+b와 같은), 상수 ( 3, 4, 등등)가 될 수 없다. L - Value : L - Value는 객체를 식별하는 메모리 위치를 말한다. L - Value는 대입 연산자 (=) 의 오른쪽 또는 왼쪽에 나타낼 수 있다. +임시 변수 = R-Value C++는 실제 매개변수와 참조 매개변수가 일치하지 않을 때 임시 변수를 생성할 수 있다. 죄근의 C++는 매개변수가 const 참조일 경우에만 이것을 허용한다. 이것은 새로운 제약이다. C++가 어떤 경우에 임시 변..

vector 와 array

vector 는 동적 배열 구조로 구성 요소가 생성되고 삭제되면서, 스스로 크기를 자동적으로 조절한다. 이는 우리가 동적 배열을 하게되면 new와 delete를 사용하지만, 실제로 vector 클래스는 메모리를 관리하기 위해서 그 과정을 자동적으로 진행한다. 백터의 인덱스는 연속된 스토리지 배치되어 백터 데이터는 끝에 삽입된다. 배열을 확장해야 하는 경우는 위치에 따라 시간이 달리 걸린다. 마지막 인덱스를 제거하는 것은 크기 조정이 수행되지 않으므로 바로 제거가 가능하여, 일정 시간만 소요된다. 인덱스를 시작 부분이나 중간 부분에 끼워 넣거나 제거할 때는 시간이 더욱 걸린다. 1) vector container 란? vector 컨테이너는 자동으로 메모리가 할당되는 배열. 이라고 생각하면 될거같습니다. ..