본문 바로가기

C/C++/C/C++일반

(7)
비트 연산자 우선순위 개발하다가 아래와 같은 경우에서 난 당연히 비트 연산자인 '&' 가 논리 연산자 '>' 보다 우선순위가 높을 거라 생각했다. if( nStyle & 8 > 0 )... 그런데 비트연산자 '&' 보다 논리연산자 '>'가 우선 순위가 더 높았다. if( (nStyle & 8) > 0 )
2차원 배열 매개변수 전달 방법 // 두번째 차원의 배열 요소만 명시하여 전달 void funcTest(char (*score)[6], int row) { int i, j; for(int i=0; i
파일 포인터 / feof() 함수 사용 tip feof() 함수는 파일포인터의 flags값이 _F_EOF일때 1을 반환한다. 파일 포인터의 flag 값이 _F_EOF가 되는 경우는 파일 포인터가 지정된 사이즈 만금의 데이터를 읽어 들이지 못했을 때이다. 예를 들면 다음과 같이 fread()함수를 사용해서 파일 데이터를 읽어들일 때 어떻게 feof() 함수가 작동되는 지를 확인 할 수 있다. int nVal = 0; while(1) { if(feof()) break; // code1 : 실행안됨 fread(&nVal, 4, 1, fp); if(feof()) break; // code2 : 실행됨 } 위 코드에서 반복문을 탈출하게 되는 코드는 "code2" 코드가 된다. 즉 일반적으로 아래와 같이 사용되는 코드에서는 정확한 파일의 끝을 알 수 없을 뿐더..
함수 템플릿, 클래스 템플릿 을 사용하는 상황과 이유 한참 C++을 공부하던 학생 때 거즘 C++ 문법책을 다볼 쯤에 나오는 챕터가 있었으니 문법도 생소한 템플릿 이었다. 그땐 뭐 이런게 있나 싶어 한번 보고 신기하다 해서 쫌 보았는데 실제 코드로 밥을 먹고 살다보니 그리고 주된 업무가 개발이다 보니 템플릿을 쓸 기회가 별로 없었다 물론 STL을 사용해서 코드를 읽을 땐 쫌 보았지만 템플릿이란 걸 일부로 프로젝트에 적용해서 쓴적은 별로 없었던 것 같다. 알고는 있지만 활용방안을 잘 몰랐던 것이다. 그렇게 잘 안쓰게 되다보니 점점 템플릿이란 것과 멀어질 쯤 아! 이런 때 템플릿을 적용하면 되겠구나 싶은 기회가 생겨 이렇게 정리를 좀 하고자 한다. 템플릿이란 쉽게 말하자면 클래스나 함수에 사용되는 변수를 특정 형으로 정하지 않고 컴파일 할 때 결정되도록 기능을..
함수 포인터 맨날 헷갈리는 함수 포인터의 사용 이렇게 정리 해본다. ※ 아래의 코드는 Microsoft visual studio 2010 에서 만 !! 테스트 한 코드이다. 컴파일러마다 문법이 조금씩 다르니 그점을 참고하시길일반 함수에대한 함수포인터 형식은 다음과 같다. 선언 : 반환값형식 (*함수명)(매개변수) 일반 함수 선언, 대입, 호출은 그럭 저럭 알만하다. 그런데 함수가 클래스 맴버 함수라면 형식과 사용법이 조금 틀려진다. 처음에 이문법을 봤을 때 이게 먼가 했다. 선언 : 반환값형식 (*클래스명::함수명)(매개변수) 멤버 함수포인터의 호출은 해당 클래스의 인스턴스가 있어야지 만 가능하다. 그래서 위의 경우에는 "this->*" 이나 "fc.*" 를 통해서 함수포인터를 호출한다. 인스턴스가 포이터일 경우에는..
가상소멸자 사용 C++ 문법을 배울때 함수 앞에 virtual 키워드가 들어가면 가상 함수가 된다고 배웠다. 배우고 난 뒤 시간이 지나면 다 까먹기 마련 그래서 이렇게 겨우 생각날 때 정리해 놓는 거다.~~ 가상함수는 의 특징은 대략 다음과 같다. 즉 가상함수로 선언되면 부모 클래스의 포인터로 해당 가상함수를 호출하더라도 호출은 가장 자식 클래스의 가상함수가 호출 된다. 보다 자세한 내용은 인터넷 검색으로 확인 할 수 있다. 이제 가상 소멸자의 사용에 대해 알아보자다음의 코드는 메모리 누수를 발생시킨다. 어느부분에서 발생되는지 한번 생각해 보자. ▼ 선언부분 ▼ 호출부분 ▼ 실행 후 메모리 누수 별 이상 없어보인다면 보통 개발자 ~ 아~ CString 이라 딱 찝으면 센스 있는 개발자 ~ 소멸자구만 하면 이글을 읽을 필..
재귀함수와 비재귀 함수 성능비교 코드 #include #include #include #include void funcTask() // 작업함수 { int i; for(i=0; i0) { ret *= n; n--; funcTask(); } return ret; } double performFunc(int (*func)(int), int nLoopCnt, char *pszText) { //clock_t stime, etime; //stime = clock(); //etime = clock(); //elaspeTime = (((double)(etime-stime))/CLOCKS_PER_SEC); LARGE_INTEGER liCounter1, liCounter2, liFrequency; QueryPerformanceFrequency(&liFreq..