Til 함수포인터
Younji Kim / August 2022
2022년 8월 16일 Today I learned
Table of contents
함수 포인터
함수 포인터(function pointer)란?
프로그램에서 정의된 함수는 프로그램이 실행될 때 모두 메인 메모리에 적재된다. 이때 함수의 이름은 메모리 내에서 함수의 시작 주소를 가리키는 포인터 상수(constant pointer)가 된다. 이렇게 함수의 시작 주소를 가리키는 포인터 상수를 함수 포인터(function pointer)라고 부른다.
포인터 상수(constant pointer)란 포인터 변수가 가리키고 있는 주소 값을 변경할 수 없는 포인터를 의미하며, 상수 포인터(pointer to constant)란 상수를 가리키는 포인터를 의미한다.
이후는 minitalk에 나왔던 포인터 상수의 프로토타입을 참고하여 작성하자..
출처 : http://tcpschool.com/cpp/cpp_function_pointer
switch문
if-else문을 연결하여 여러가지 경우의 수를 처리하는 게 보통의 방법이다. 그러나 CPP01의 ex05에서는 if/else-if/else문을 사용하지 말라고 써있어서 switch문으로 우회해보았다.
if (check == 0)
{}
else if (check == 1)
{
(this->*ptr[cal])();
}
// if (check)
// (this->*ptr[cal])();
위와 같은 if-else문을 아래와 같이 switch문을 통해 똑같은 일을 수행하는 코드로 만들 수 있다.
switch (check)
{
case 0:
break;
case 1:
(this->*ptr[cal])();
break;
default:
break;
}
cin에 int만 입력받는 방법
cin 객체는 공백 단위로 구분하여 사용자로부터 입력을 받는 콘솔 인풋 객체이다. 입력받은 데이터를 버퍼에 저장한 후 하나씩 꺼내온다.
cin 객체는 다음과 같은 내부 상태 플래그들을 가지고 있다.
- fallbit : 입력이 실패했다는 뜻. 정수를 입력받는 데 문자가 입력된 경우 1이 된다. fail() 멤버함수를 사용해 호출할 수 있다.
- eofbit : 파일의 끝에 도달했다는 뜻. 더 이상 읽을 문자가 없으므로 에러를 반환한다. eof() 멤버함수를 사용해 호출할 수 있다.
- badbit : 스트림이 물리적으로 손상됐다는 뜻. 더 이상 읽을 수 없어 에러를 반환한다. bad() 멤버함수를 사용해 호출할 수 있다.
- gootbit : 위의 세 에러가 발생하지 않았다는 뜻으로 0이 된다. good() 멤버함수를 사용해 호출할 수 있다.
문자가 들어왔을 경우 입력받지 않는 방법
- !cin 또는 cin.fail() : !는 bool 자료형을 처리하는 연산자인데 해당 연산자를 오버로딩하여 cin객체에 사용할 경우, 객체의 내부 상태 플래그의 값을 bool형으로 리턴한다. cin으로 int 자료형 이외의 타입을 입력받았을 경우 fallbit가 1이 되어 개발자가 처리해줄 수 있다.
- cin.clear() : 비정상 입력을 받았을 경우에 내부 상태 플래그는 1을 가리키게 된다. 그러나 계속해서 입력을 받을 경우 정상입력을 하더라도 오류가 뜬 플래그 때문에 프로그램은 계속 비정상입력이라고 간주하기 때문에, 플래그를 초기화시켜 정상화를 시켜야 한다. 인자 없이 호출할 경우 모든 플래그를 초기화시킨다.
- cin.ignore(읽어들일 문자의 개수, 읽어들이면 종료하는 문자) : 위에서 말했듯 cin은 문자를 입력받을 경우에는 입력한 문자가 입력 버퍼에 저장되고 그 값을 하나씩 읽어오는 방식이다. 숫자와 문자를 같이 입력받았을 경우 이 문자는 입력 버퍼에 저장이 되고, 저장된 값을 cin이 계속 읽어오려 하면서 정수형 변수에 저장하려고 하기 때문에 계속 fallbit를 1로 설정하며 비정상입력으로 간주된다. 그렇기 때문에 cin.ignore()함수를 사용하여 버퍼를 비워주어야 한다.
첫번쨰 인자는 GNL의 버퍼사이즈처럼 한 번에 얼마나 읽을 것인지를 뜻하며(5를 넣을 경우 5사이즈씩 나눠서 읽는다), 두번째 인자는 보통 ‘\n’을 쓴다. cin을 통해 입력받을 때 엔터를 눌러 입력을 끝마치기 때문에, 이 문자를 끝으로 버퍼비우기를 마친다는 뜻이다.
출처 : https://blog.naver.com/lyw94k/220858647150