nullptr
포인터 전용 null 값
NULL의 문제점
void func(int x);
void func(int* x);
func(NULL);
NULL은 일반적으로 다음과 같이 정의되어 있다.
#define NULL 0
즉, NULL은 결국 정수 0이다.
따라서
void func(int);
void func(int*);
두 함수 모두 호출 후보가 된다.
0→int변환 가능0→int*변환 가능
컴파일러는 어떤 함수를 호출해야 하는지 결정할 수 없기 때문에 모호성(Ambiguity) 오류가 발생한다.
nullptr 사용
void func(int x);
void func(int* x);
func(nullptr);
nullptr은 std::nullptr_t 타입을 가지는 특수한 값이다.
- 포인터 타입으로만 변환 가능
- 정수 타입으로는 변환되지 않음
따라서
func(int*);
만 호출 후보가 된다.
결과적으로 컴파일러는 명확하게 func(int*)를 선택할 수 있으며 모호성 오류가 발생하지 않는다.
nullptr의 특징
int* ptr = nullptr;
nullptr은
- 유효한 메모리를 가리키지 않는 상태를 표현하는 값
- 포인터 전용 null 값
std::nullptr_t타입을 가지는 특수한 리터럴
이다.
NULL vs nullptr
| 구분 | NULL | nullptr |
|---|---|---|
| 타입 | 정수(0) | std::nullptr_t |
| 정수 변환 | 가능 | 불가능 |
| 포인터 변환 | 가능 | 가능 |
| 함수 오버로딩 모호성 | 발생 가능 | 발생하지 않음 |
| C++ 권장 여부 | 비권장 | 권장 |
권장 방식
현대 C++에서는 NULL 대신 nullptr 사용을 권장한다.
int* ptr = nullptr;
if (ptr == nullptr)
{
// 포인터가 아무것도 가리키지 않음
}
포인터가 유효한 객체를 가리키지 않는다는 의미를 명확하게 표현할 수 있으며, 함수 오버로딩에서 발생할 수 있는 모호성 문제도 방지할 수 있다.
'c++ > 기초' 카테고리의 다른 글
| extern (외부 변수) (0) | 2026.06.05 |
|---|---|
| 분할 구조 (Header / Source File) (0) | 2026.06.05 |
| #define 0 NULL (0) | 2026.06.02 |
| 참조자(Reference) (0) | 2026.05.31 |
| 포인터 (0) | 2026.05.31 |