c++에서의 c와는 조금 다르게 Null을 정수의 0으로만 정의하며(MACRO를 통해)
사용하기에 유효하지 않은 메모리의 0번지에 접근하게합니다.
그렇게 함으로 NULL 포인터 상수를 다룹니다.
c++11미만의 경우 : int 0으로 평가되는 rvalue
c++11이상의 경우 : 정수 리터럴 0, std::nullptr_t 타입의 prvalue
앞서 c와는 조금 다르다 하였는데 c는 (void*)0의 방식도 사용합니다.
이 방식은 (void*)의 특성상 여러 포인터로 변환이 가능하기에
이를 위험하다 판단하여 c++에서는 c++ c와의 호환을 위해서
0만을 MACRO를 통해 정의해 NULL 포인터 상수를 다룹니다.
(정보출처 : https://stackoverflow.com/a/69057243/18325764)
이렇게 c++은 정수형 0을 NULL 포인터 상수로 다루기에
다음과 같은 함수의 오버로딩에서 모호함의 문제가 나타날 수 있습니다.
0이 내부적으로 정수의 역할과 포인터 상수로써 두 역할을 하는 셈입니다.
nullptr의 도입
그래서 이러한 문제를 해결하기 위해 C++11 부터는 nullptr이 도입되었습니다.
nullptr은 포인터 리터럴로 기존의 NULL과는 다르게 0과 구분됩니다.
nullptr은 std::nullptr_t이라는 타입을 가지며
여러 포인터로 암시적 형변환이 가능합니다.
(위에서는 이러한 방식이 위험하여 0으로만 NULL을 다룬다 하였는데
이는 수용하기로 한 것 같다고 조심스럽게 생각한다.)
그리고 nullptr을 사용함으로 그 목적이 뚜렷해 안전하게 쓸 수 있으며 가독성에도 이롭다.
아직 여러 라이브러리에서는 NULL이 많이 보이고 nullptr도 같이 쓰이지만
modern c++관점에서는 nullptr을 사용하는 것이 더욱 바람직하다고 본다.
읽어봐 주셔서 감사합니다. 부족한 부분은 사소한 부분이더라도 알려주시면 감사하겠습니다.
'지식 정리' 카테고리의 다른 글
c++) regex_replace (0) | 2022.05.27 |
---|---|
[UML] 클래스 다이어그램 (설명, 용어) (0) | 2022.05.20 |
windows 키보드 리매핑 (키 위치 바꾸기, 별도의 프로그램 x, 스캔코드 맵, 예시 Esc와 Caps Lock 맞바꿈) (5) | 2022.04.28 |
Visual Studio Code 작업화면 한글 깨질 경우 해결 방법. (terminal 아님) (0) | 2022.04.27 |
왜 c언어에선 헤더 파일과 소스 파일을 구분할까? (c++, c#, 빌드 프로세스) (0) | 2022.03.30 |
댓글