프로그램/C,C++
[C++ 기본] 11. nullptr
naudhizb
2022. 1. 29. 23:17
반응형
C언어에서의 NULL 의 값은 0으로 고정되어 있다. C의 특성 상 포인터 값과 변수값 사이의 변환이 상대적으로 자유롭기 때문에 포인터가 아닌 변수값에 대해서도 NULL 값을 입력할 수 있고, 포인터 값에 대해서도 0을 입력할 수 있다.
// 11_nullptr1.cpp 54 page
int main()
{
// 0의 정체 : 0은 정수지만 포인터로 암시적 형변환된다.
int n1 = 0; // ok
int* p1 = 0; // ok
// C++11. nullptr : 포인터 0
int n2 = nullptr; // error
int* p2 = nullptr; // ok
}
C++에서는 포인터의 NULL값을 좀 더 strict 하게 지정할 수 있는 nullptr을 사용할 수 있다.
해당 값은 포인터에만 입력할 수 있으며, 변수에 입력하게 되면 컴파일링 단계에서 오류를 발생시킨다.
#include <iostream>
void foo(void* p) { std::cout << "void*" << std::endl;}
void foo(int n) { std::cout << "int" << std::endl; }
void goo(char* p) { std::cout << "goo" << std::endl; }
int main()
{
foo(0); // int
foo((void*)0); // void*
/*
#ifdef __cplusplus // 모든 C++컴파일러는 이 매크로 정의.
#define NULL 0
#else
#define NULL (void*)0
#endif
*/
foo(NULL);
goo(NULL); // void* => char* 의 암시적 변환 필요
// C언어 : ok.. C++언어 : error
double d = 0.0;
int n = 0;
nullptr_t a = nullptr; // nullptr의 타입은 nullptr_t 입니다.
// nullptr_t 타입은 모든 타입의 포인터로
// 암시적 형변환 됩니다.
int* p3 = a; // ok.. 결국 nullptr
}
C++에서는 C언어에서 implicit하게 쓰여왔던 암시적 형변환에 대해서 컴파일러 단계에서 좀 더 처리하기 때문에 C언어에서 사용할 수 있었던 문장들을 C++에서는 사용할 수 없게 되는 경우도 있다.
nullptr의 경우 void* 와는 다른 타입이기 때문에 implicit casting이 가능하다.
반응형