Brise

[C++ 기본] 11. nullptr 본문

프로그램/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이 가능하다.

반응형

'프로그램 > C,C++' 카테고리의 다른 글

[C++ 기본 2] 3. example(reference, template)  (0) 2022.01.29
[C++ 기본 2] 2. memory allocation  (0) 2022.01.29
[C++ 기본 2] 1. reference  (0) 2022.01.29
[C++ 기본] 10. Casting  (0) 2022.01.29
[C++ 기본] 9. 제어문  (0) 2022.01.29
[C++ 기본] 8. 반복문  (0) 2022.01.29
[C++ 기본] 7. template function  (0) 2022.01.16
Comments