본문 바로가기

고급C,C++

C언어 파일 입출력 고려할것 FILE *fp; fp -------------------> _ptr : 현재 가리키고 있는 byte _cnt : 남은 바이트수(_cnt로는 EOF을 알수 없음 buffersize의 남은 byte수) _base : buffer의 첫 byte _flag : 파일의 현 상태를 나타냄 _file : fd 번호(파일디스크립터) EOF는 무슨근거로?? -> 시스템에서 파일의 크기를 알 수 있다. 파일에서 -1값을 잃어 온 것이 아니라 시스템파일의 끝을 탐지해내서 -1을 받아온 것이다. int ch; while((ch = fgetc(fp)) != EOF) { } 여기서 ch가 int형인 이유가 있다. text파일에는 상관이 없지만 바이너리 파일을 이용할 때는 0xff 패턴이 있다. char형으로는 0xff는 -1이.. 더보기
union 활용법 1. 상호배타적인 상황에서 사용, 메모리최적화에 응용할 수 있다. flag를 이용해 상호배타적으로 사용한다. 2. union을 이용하면 parcing이 용이하다. //2번째 용도 예 #if 1 typedef union { int i; char c[4]; }u; int main(void) { int i; u u; u.i = 0x12345678; for(i = 0; i 더보기
mutable 상수 멤버 함수에서 mutable 데이터 멤버 일 경우에는 수정이 가능하다. class CTextBook { public: ... std::size_t length() const; private: char * pText; mutable std::size_t textlength; mutable bool lengthIsValid; }; std::size_t CTextBook::length() const //상수 멤버 함수 { if(!lengthIsValid){ textLength = std::stelen(pText); lengthIsValid = true; } return textlength; } 더보기
const_iterator std::vector vec; ... const std::vector::iterator iter = vec.begin(); //iter 는 T* const 처럼 동작 *iter = 10; //동작 ++iter; //에러 std::vector::const_iterator cIter = vec.begin(); //cIter는 const T* 처럼 동작 *cIter = 10;//에러 ++cIter;//동작 더보기
클래스와 static멤버, 클래스 상수 정의 const char * const Name = "feelpass"; const std::string Name("feelpass"); #include using namespace std; class Person { char name[20]; int age; static int count; public: Person(char* _name, int _age) { strcpy(name, _name); age = _age; cout 더보기
클래스 템플릿 템플릿들은 함수가 아니기 때문에 개별적으로 컴파일할 수 없다. 템플릿들은 특별한 구체화 요구들과 함께 결합하여 사용해야 한다. 가장 간단한 방법은, 모든 템플릿 관련 정보를 헤더 파일에 집어 놓고, 그 템플릿들을 사용하는 파일에 그 헤더 파일을 포함시키는 것이다. // stacktp.h -- a stack template #ifndef STACKTP_H_ #define STACKTP_H_ template class Stack { private: enum {MAX = 10}; // constant specific to class Type items[MAX]; // holds stack items int top; // index for top stack item public: Stack(); bool ise.. 더보기
함수 템플릿 함수 템플릿은 임의 데이터형으로 함수를 정의하는 것을 허용한다. 기본적인 함수 템플릿 //funtemp.cpp - 함수 템플릿 사용하기 #include template void Swap(t & a, t & b); int main() { using namespace std; int i = 10; int j = 20; cout 더보기
cctypes 라이브러리 cctype 문자 함수 함수 이름 리턴값 isalnum() 전달인자가 영숫자, 즉 알파벳 문자이거나 숫자이면 true isalpha() 전달인자가 알파벳 문자이면 true isblank() 전달인자가 빈칸 문자 또는 수평 탭 문자이면 true iscntrl() 전달인자가 제어 문자이면 true isdigit() 전달인자가 십진 숫자이면(0~9) true isgragh() 전달인자가 빈칸이 아닌 인쇄할 수 있는 문자이면 true islower() 전달인자가 소문자이면 true isprint() 전달인자가 빈칸을 포함하여 인쇄할 수 있는 문자이면 true ispunct() 전달인자가 구두점 문자이면 true isspace() 전달인자가 표준 화이트스페이스, 즉 빈칸, 용지 이송, 개팅, 캐리지 리턴, 수평 .. 더보기
확장 char형 : wchar_t 때로는 프로그램이 1바이트로 표현할 수 엇ㅂ는 문자세트를 처리해야 하는 경우도 있다. C++는 이것을 두 가지 방법으러 처리한다. 첫째, 확장 문자 세트가 시스템의 기본 문자 세트이면, 컴파일러 개발업체가 char형을 처음부터 2바이트 또는 그 이상으로 만드는것이다. 둘째, 기본 문자 세트에 확장 문자 세트를 동시에 지원하는 것이다. 즉, 보통의 8비트 char형으로 기본 문자세트를 나타내고, wchar_t형(wide charactor type에서 w,char,t를 각각 따 왔다.)으로 확장 문자 세트를 나타내는 것이다. wchar_t형은 시스템에 사용되는 가장 큰 확장 문자 세트를 나타낼 수 있을 만큼의 충분한 비트 폭을 가진 정수형이다. wchar_t 형은 기초 데이터형(underlying type).. 더보기
signed char형과 unsigned char형 int형과는 달리, char형은 signed형이나 unsigned형으로 미리 정해져 있지 않다. 그것은 C++ 시스템 개발자가 하드웨어 특성에 맞추어 알맞은 char형을 정할 수 있도록 하기 위한 배려이다. 그러나 char형이 어느 특별한 한 가지 행동만을 보여야 한다면, signed char형 또는 unsigned char형을 사용하여 그 행동을 명시적으로 제한할 수 있다. char fodo; //signed형 또는 unsigned형 unsigned char bar; //명백히 unsigned형 signed char snark; //명백히 signed형 이러한 구별은 char형으로 수를 나타내고 할 때 특히 중요하다. unsigned char형은 0에서 255까지의 범위를 나타낼 수 있고, signed.. 더보기
climits climits에 정의되어 있는 상수 기호들 CHAR_BIT char형의 비트 수 CHAR_MAX char형의 최대값 CHAR_MIN char형의 최소값 SCHAR_MAX SCHAR_MIN UCHAR_MAX SHRT_MAX SHRT_MIN USHRT_MAX INT_MAX INT_MIN UINT_MAX LONG_MAX LONG_MIN ULONG_MAX 더보기
함수 객체(Functor) 많은 STL 안고리즘들이 펑크너라고 부르는 함수 객체를 사용한다. 평크터는 함수처럼 () 과 함께 사용할 수 있는 객체이다. 일반 함수의 이름, 함수를 지시하는 포인터, () 연산자가 오버로딩된 클래스 객체 - 즉 operator() ()라는 이상한 모양의 함수가 정의된 클래스들이 모두 펑크터가 될 수 있다. class Linear { private: double slope; double y0; public: Linear(double _s1 = 1, double _y = 0) :slope(_s1), y0(_y) {} double operator()(double x){return y0 + slope*x;} }; 이제 오버로딩된 () 연산자가 Linear 객체들을 함수처럼 사용하는 것을 허용한다. Linea.. 더보기
이터레이터 이터레이터가 필요한 이유 - 이터레이터를 이해하는 것이 STL을 이해하는 열쇠이다. 템플릿이 알고리즘을 저장할 데이터형과 무관하게 만드는 것처럼, 이터레이터는 알고리즘을 사용할 컨테이너형과 무관하게 만든다. 이터레이터는 STL의 일반화 접근에 필수 구성요소 이다. find 함수를 구현하기 위해 이터레이터가 가져야 하는 특성 이터레이터가 참조하는 값에 접근하기 위해 내용 참조를 할 수 있어야 한다. 즉, p가 이터레이터라면 *p가 정의되어야 한다. 한 이터레이터를 다른 이터레이터에 대입할 수 있어야 한다. 즉, p와 q가 이터레이터라면 p = q 라는 표현이 정의되어야 한다. 한 이터레이터가 다른 이터레이터에 대입할 수 있어야 한다. 즉, p와 q가 이터레이터라면 p = q 라는 표현이 정의되어야 한다. .. 더보기
표준 템플릿 라이브러리(STL-Standard Template Library) 표준 템플릿 라이브러리(STL-Standard Template Library)는 컨테이너, 이터레이터, 함수 객체, 알고리즘을 나타내는 탬플릿들의 집합을 제공한다. 컨테이너는, 배열과 같이, 여러 개의 값을 저장할 수 있는 구성 단위이다. STL 컨테이너는 동질적(homogeneous)이다. 즉, 그들은 같은 종류의 값들을 저장한다. 알고리즘은, 배열을 소트하거나 리스트에서 특정 값을 검색하는 것과 같은, 특별한 작업들을 수행하기 위해 사용하는 방법이다. 이터레이터는, 배열 안에서 포인터를 사용하여 위치를 옮기듯이, 컨테이너 안에서 위치를 옮길수 있도록 도와주는 객체들이다. 즉, 이터레이터는 포인터의 일반화이다. 함수 객체는 함수와 비슷한 역할을 하는 객체이다. 함수 객체는 클래스 객체일 수도 있고, 함.. 더보기
auto_ptr 클래스 auto_ptr 객체를 생성하려면, auto_ptr 템플릿이 들어있는 memory 헤더파일을 포함시켜야 한다. 그러고 나서, 일반적인 템플릿 구문을 사용하여 필요한 포인터의 종류를 구체화한다. auto_ptr pd(new double); //double 을 지시하는 auto_ptr //(double* 대신에 사용한다) auto_ptr ps(new string); //string을 지시하는 auto_ptr //(string * 대신에 사용한다) #include void remodel(string & str) { auto_ptr ps(new string(str)); ... if(weird_thing()) throw exception(); str = *ps; //delete ps; 이행은 이제 필요없다. re.. 더보기
string 클래스 문자열 처리 함수들은 string.h(C++에서는 cstring)을 통하여 지원한다. string 클래스는 string헤더 파일을 통해 지원된다.(string.h와 cstring 헤더 파일은, string클래스가 아니라 C스타일의 문자열을 처리하는 C 라이브러리 문자열 함수들을 지원하는 것이다.) 문자열 생성 string(const char * s) string 객체를 s가 지시하는 NBTS로 초기화 한다. string(size_type n, char c) 문자 c로 모두 초기화된 원소 n개의 string 객체를 생성한다. string(const string & str, size_type pos = 0, size_type n = npos) string 객체를 size_type pos = 0 으로 초기화한.. 더보기
데이터형 변환 연산자 데이터형 변환 과정을 더욱 엄격하게 규정한다. dynamic_cast const_cast static_cast reinterpret_cast dynamic_cast 어떤 클래스 계층 내에서 업캐스트를 허용하고, 다른 데이터형 변환은 허용하지 않는것 dynamic_cast (expression) const_cast 어떤 값을 const나 volatile로 또는 그 반대로 변경하는 것이 유일한 목적인 데이터형 변환을 위한 것이다. const_cast (expression) 이와 같은 데이터형 변환의 결과는 그 데이터형의 다른 어떤 측면이 변경되면 에러이다. 즉, type_name과 expression은 const나 volatile이 있느냐 없느냐에 따라 달라지는 것만 빼고는, 데이터형이 동일해야 한다. 예를.. 더보기
RTTI(runtime type identification) RTTI(runtime type identification) - 실행 시간 데이터형 정보 어떤 C++ 시스템들은 RTTI 기능을 켜거나 끌 수 있는 설정을 가지고 있다. RTTI의 목적은, 프로그램이 실행 도중에 객체의 데이터형을 결정하는 표준 방법을 제공하는 것이다. RTTI의 목적 하나의 공통 기초 클래스로부터 상속된 클래스 계층이 있다고 가정하자. 이 클래스 계층에 속해 있는 클래스들의 어떤 객체를 기초 클래스 포인터가 지시하도록 설정할 수 있다. 그 다음에, 어떤 정보를 처리한 후 이들 클래스들 중에서 어느 하나를 선택하고, 그 클래스형의 한 객체를 생성하고, 기초 클래스 포인터에 대입하기 위해 그 객체의 주소를 리턴하는 함수를 호출한다. 그 포인터가 지시하는 객체의 종류가 무엇인지 어떻게 알 수.. 더보기
[C++] 프렌드, 예외, 기타 사항 프렌드 클래스의 모든 메서드는 오리지널 클래스의 private 멤버와 protected 멤버에 접근할 수 있다. 또한 더욱 제한을 가하여 어떤 클래스의 특정 멤버 함수들만 다른 클래스의 프렌드가 되도록 지정할 수 있다. 클래스는 함수, 멤버함수, 클래스 중 어떤 것이 프렌드인지 정의한다. 프렌드 관계는 바깥 세계에서는 설정할 수 없다. 그러므로 프렌드들이 클래스의 private 부분에 대한 외부 접근을 허용하더라고도 그들이 객체 지향 프로그래밍 철학을 실제로 위반하는 것은 아니다. 오히려 public 인터페이스에 더 많은 융통성을 제공한다. 1. 프랜드클래스 Tv 클래스와 리모콘 클래스 사이의 관계 friend class Remote; 프렌드 선언은 public, private, protected 부분 .. 더보기
C++ 입력, 출력, 파일 cin.get(); cin.get(); return 0; 17장 입력, 출력, 파일 int eggs = 12; char * amount = "dozen"; cout 더보기
[C++]Critical Section class CS_Guard { public: CS_Guard() { InitializeCriticalSection(&m_cs); ::EnterCriticalSection(&m_cs); } ~CS_Guard() { ::LeaveCriticalSection(&m_cs); DeleteCriticalSection(&m_cs); } private: CRITICAL_SECTION m_cs; }; 더보기
[고급씨언어] delete 처리 하기 위한 goto 이용법 28 void foo() 29 { 30 FILE * fp = fopen("1.txt","r"); 31 if(fp == NULL) 32 { 33 goto delete_ok; 34 35 } 36 FILE * fp2; 37 if(fp2 == NULL) 38 { 39 goto delete_fp1: 40 } 41 42 FILE * fp3; 43 44 45 delete_fp2: 46 fclose(fp); 47 delete_fp1: 48 fclose(fp1); 49 delete_ok: 50 return ; 51 } 더보기
[고급C언어] 연산자 우선순위 연산자 우선순위 및 결합순서 컴퓨터언어는 개발자를 비롯한 컴퓨터 과학/공학자들의 요구에 따라 다양하게 진화되었다. 최대한 인간의 일반적인 사고를 바탕에 두고 문법과 체계를 만든 것이지만, 아무래도 언어 개발자들의 마인드가 포함되어 있어 일반에게는 약간 어렵기도 한 것 같다. 다음은 C++ 연산자 우선순위표이다. 이것을 잘 알아야, 복잡한 포인터와 구조체, 배열이 섞인 복잡해 보이는 식도 기계적으로 풀어낼 수 있다. 그러므로 다음은 반드시 암기 가능하면 이해할 사항이다. 간략본(http://www.winapi.co.kr/clec/cpp1/5-4-1.htm) 순위 연산자 결합순서 1 ( ) [ ] -> . 왼쪽 우선 2 ! ~ ++ -- + -(부호) *(포인터) & sizeof 캐스트 오른쪽 우선 3 *(.. 더보기
[고급C언어] void형 포인터 - void * voidp ① void형 포인터란? 널 포인터는 아무것도 가리키지 않은 포인터였다. void형 포인터도 같은 의미로 착각하면 안된다. void형 포인터는 어느 것이든 가리킬 수 있는 포인터이다. 좀더 늘여 쓴다면 "void형 포인터는 현재 가리키고 있는 대상체가 정해져 있지 않은 포인터"가 된다. void *imsip; imsip는 void형 포인터 변수이다. imsip는 가리키는 대상체가 정해져 있지 않은 포인터 변수라고 정의하였다. imsip는 포인터 변수이기 때문에 imsip 안에는 분명 주소 값이 저장되어 있을 것이다. 이것은 현재 어떠한 대상체를 가리키고 있는가? 이 말을 다시 풀이하면 "현재 가리키고 있는 주소 값에서 몇 바이트를 읽어올 것인가?"와 같은 질문이 된다. imsip 자체는 가리키는 대상체가.. 더보기
[고급C언어] *((int*)voidp)++ int imsi[]={7, 4, 9}; void *voidp; voidp=imsi; for(i=0;i 더보기
[고급C언어] 함수포인터 ① 함수 포인터의 정의 함수를 가리키는 포인터를 정의하는 것은 여타의 포인터 변수 정의처럼 상당히 쉬운 작업이다. type (*name)(arg list); name은 함수를 가리킬 수 있는 포인터 변수이다. (그러므로 name에 대한 4바이트가 할당된다.) "type"은 name이 가리키는 함수가 리턴하는 형(type)을 말하고 "arg list"는 name이 가리키는 함수의 매개변수 리스트이다. int (*imsi)(int, char *); imsi가 가리키는 함수는 int형을 리턴하고 인자로 "int"와 "char *"를 가진다. ② 함수 포인터 호출 함수 포인터를 초기화 한다는 것은 만들어 놓은 함수 포인터 변수에 함수를 대입하는 과정이다. 함수를 대입한다기 보다는 함수가 저장된 곳의 번지를 할당.. 더보기
[고급C언어] 연산자의 우선순위 우선순위 연산자 처리순서 ↑높음 ↓낮음 ++ -- +(부호연산자) -(부호연산자) ~ ! 캐스트 연산자 ← * / % → +(덧셈 연산자, 문자열 연결 연산자) -(뺄셈 연산자) → >>> → = → == != → & → ^ → | → && → || → ?: ← = += -= *= /= %= &= |= ^= >= >>>= ← 더보기
[고급C언어] 매크로함수, #ifdef, #ifndef, #undef, #if, #elif, #else, #endif - #if, #elif, #else, #endif문 조건부 컴파일을 위한 것으로 특정 조건이 만족하면 컴파일 작업을 수행하고 그렇지 않으면 수행하지 않도록 하기 위해 사용된다. 조건부 컴파일을 위한 전처리 지시자 살피기 #include #define MAX 20 void main() { int size; #if MAX > 100 size=100; #elif MAX > 10 size=10; #else size=0; #endif printf(" size = %d \n", size); } - #ifdef, #ifndef문 특정 매크로가 정의되어 있는지를 확인하기 위해 사용된다. #ifdef문은 특정 매크로가 정의되어 있는지를 물어 본다. #ifndef문은 “if not define”, 특정 매크로가 정의되어 .. 더보기
[고급C언어] 가변인자 우리는 지금까지 인자의 개수를 한정지어 프로그램을 작성하였다. int func_1(int, int, int); int func_2(int, char *, float); int func_3(char, char, char, char*);func_1(), func_2()의 인자 개수는 3이고 func_3() 은 4이다. 이 둘을 하나의 함수로 재작성할 수 있을까? 인자의 개수가 늘었다 줄었다 할 수 있는 함수를 작성할 수 있도록 도와주는 것이 가변인자이다. 인자의 개수 뿐만 아니라 인자의 형(type)도 상관없다. ① 가변 인자 사용 단계 ⓐ 함수의 원형 정의 인자 리스트에 "..."을 사용한다. int func(int, ...); 가변 인자에 해당하는 부분에 점을 세 개 나열하면 된다. int는 고정된 것이.. 더보기
[고급C언어] 구조체의 메모리 저장방식과 #pragma pack 구조체는 메모리에 어떤 식으로 저장될까 다음과 같은 소스를 보자. #include typedef struct _TEST{ char cData; short sData; int iData; }TEST; int main() { TEST TData={0,}; printf("cData size : %d\n", sizeof(TData.cData)); printf("sData size : %d\n", sizeof(TData.sData)); printf("iData size : %d\n", sizeof(TData.iData)); printf("TData size : %d\n", sizeof(TData)); return 0; } #include typedef struct _TEST{ char cData; short sD.. 더보기