본문 바로가기
728x90

[프로그래밍 공부]/C&C++13

[C++] 레퍼런스 사용 시 주의 사항 C++에서 레퍼런스(Reference, 참조)란 변수에 대한 앨리언스(Alias, 별명)이다. 변수에 대한 별명이기 때문에 일반적인 자료형 뿐 아니라 포인터 자료형에 대해서도 사용이 가능하다. 레퍼런스 변수의 값을 변경하는 경우 해당 레퍼런스가 가리키는 원본의 값이 변경된다. int x = 10; int& xRef = x; xRef = 15;// x 는 15로 변경되었다. 레퍼런스는 변수의 주소를 가져오거나 변수에 대한 역참조 연산을 자동으로 수행하는 특수 포인터로 볼 수 있다. xRef 변수를 사용하는 것은 x를 사용하는 것과 동일하다. 즉, &xRef 연산으로 xRef의 주소를 찾는 경우 x의 주소 값인 &x가 반환된다. 다르게 말하면 &xRef == &x가 true가 된다. 이러한 레퍼런스를 사용할.. [프로그래밍 공부]/C&C++ 2023. 1. 27.
[C++] 함수 오버라이딩의 특수 케이스 함수 오버라이딩을 하다보면 의도하지 않은 동작을 할 때가 있다. 부모 클래스와 자식 클래스가 static 함수를 같은 이름으로 둘 다 들고 있다거나, 오버로딩 된 함수의 일부만 오버라이딩 한다거나 하는 등의 일들이 발생한다. 이러한 예외적인 상황에 대해 알아본다. 동일한 이름의 static 함수 처리 부모 클래스의 오버로딩한 함수 중 일부만 오버라이딩 하는 경우 Public이 아닌 함수의 오버라이딩 부모 클래스 함수에 디폴트 매개변수가 있는 경우 오버라이딩 함수의 접근 지시자가 다른 경우 [동일한 이름의 static 함수 처리] 기본적으로 C++에서는 static 함수를 오버라이드 할 수 없다. 애초에 virtual 과 static 을 동시에 사용할 수가 없기 때문에 컴파일 자체가 불가능하다. 그러나 같.. [프로그래밍 공부]/C&C++ 2023. 1. 9.
[C/C++]댕글링 포인터 정리 댕글링 포인터란? 댕글링 포인터(Dangling Pointer)란 이미 해제된 메모리 영역를 계속해서 가리키고 있는 포인터를 말하는 것으로 유효하지 않은 메모리를 가리키고 있기 때문에 Segmentation fault 가 발생할 수 있다. int *pData = (int*)malloc(sizeof(int)); free(pData); *pData = 10;// 댕글링 포인터 위의 상황에서 free(pData); 이후 pData는 댕글링 포인터가 되었으며 *pData를 통해 10을 넣으려고 함과 동시에 Segmentation fault가 발생한다. 상황에 따라서 오류가 아닌 채 동작할 수 있으나 정상동작이 아니므로 버그의 원인이 된다. int *pData1, *pData2; pData1 = (int*)mal.. [프로그래밍 공부]/C&C++ 2022. 5. 19.
[C++] decltype 이란? decltype은 주어진 이름이나 표현식의 형식을 알려주는 역할을 한다. ( decltype에 대한 정보 https://msdn.microsoft.com/ko-kr/library/dd537655.aspx ) decltype은 대부분 예상한 자료형을 알려주지만 가끔 생각지도 못한 결과를 제공하는 경우가 있다. 그렇기에 decltype의 작동 방식을 공부해보자. decltype은 템플릿이나 auto와 다르게 주어진 이름이나 표현식의 구체적인 자료형을 그대로 말해준다. 다음 예를 보자. 위 예에서 사용된 코드들은 우리가 생각할 수 있는 그대로가 decltype을 통해 표현된다. 대체로 자료형 T의 객체들을 담은 컨테이너(vector, deque 등)에 대한 operator[] 연산은 T&를 반환한다. 그러나 .. [프로그래밍 공부]/C&C++ 2022. 1. 22.
[C++] 왜 typedef 가 아닌 using을 사용해야 할까? 사용자 정의 자료형 또는 STL 컨테이너들을 사용하다보면 자료형이 매우 길어지기도 한다. std::unique_ptr 처럼 말이다. 그런 경우 우리는 편의를 위해 typedef 를 사용한다. 그런데 typedef 자체는 C++98부터 전해져오던 방식으로 구식이 되었다 C++11에서 사용하는데 문제는 없지만 별칭 선언(alias declaration)을 제공하기 때문이다. 그렇다면 별칭 선언은 무엇인가?! 바로 using 을 사용하는 것이다. 위 처럼 사용한다. using 과 typedef는 하는 일이 완전히 같다. 그렇다면 왜 using을 사용하는 것이 더 좋을까? 함수포인터를 보자. 아래의 두 함수포인터는 모두 같은 일을 수행한다. 위 두 함수포인터는 완전히 같다. 그렇지만 대입 연산을 사용하는 아래(.. [프로그래밍 공부]/C&C++ 2022. 1. 22.
[C++] enum class 사용하기 일반적으로 중괄호 안에서 선언된 변수 등은 중괄호 안에서만 효력을 발휘한다. 전역에서 선언된 것들이 아닌 로컬영역에서 선언된 것들이 그런 것들이다. 위 처럼 test 함수의 로컬 영역에서 선언된 test는 그 범위를 벗어나는 순간 없는 것으로 판단된다. 따라서 main 함수 안에서 또 다시 test를 선언하고 사용할 수 있다. 그런데 enum의 경우 좀 다르다. 이를 공식적으로 unscoped enum 이라 한다. ( 이하 범위 없는 enum ) 이와 반대되는 개념으로 C++11에 도입된 scoped enum 이 존재한다 ( 이하 범위 있는 enum ) 바로 enum클래스 이다. 범위 있는 enum은 중괄호의 범위가 효력을 발휘하게 된다 범위 있는 enum의 강점 중 하나는 열거자들의 자료형에 강력하게 .. [프로그래밍 공부]/C&C++ 2022. 1. 22.
[C++] 범위 기반 for 문 다른 언어에서 사용하는 foreach와 같은 문법이다. foreach를 안다면 범위 기반 for문이 무엇인지 바로 알 수 있을 것이다. 기본적인 사용법 coll은 에러를 없애기 위해 임시로 만들었다. 범위 기반 for문 이기 때문에 배열 등의 범위를 가질 수 있는 변수를 사용해야한다. std::initializer_list 는 being() 과 end()를 제공하기 때문에 초기화자 목록 또한 범위 기반 for문을 사용할 수 있다. for문 내부 명령문은 지역 복사본을 가지고 동작하기 떄문에 참조자를 사용한다. 한번에 보자. 결과값이 같은 것을 볼 수 있다. 또한 크기가 알려진 일반 C 형식의 배열도 범위 기반 for문을 사용할 수 있다. [프로그래밍 공부]/C&C++ 2022. 1. 22.
[C] while문 안에서 scanf 받기 scanf 함수는 파일의 끝을 만나거나 에러가 발생한 경우 -1을 반환한다. 이를 이용하여 while문의 조건으로 사용할 수 있다. int main() { int num1, num2; while (scanf("%d %d ", &num1, &num2) != -1) { printf("%d\n", num1 + num2); } } 위 코드는 2개의 수를 입력 받아 합을 출력하는 코드다. while문은 조건이 참일 때 동작하므로 scanf가 에러 또는 파일의 끝(EOF)를 만날 때까지 무한히 반복한다. [프로그래밍 공부]/C&C++ 2022. 1. 13.
728x90