내 세상

[C++] nullptr 본문

Language/C/C++

[C++] nullptr

sga8 2020. 1. 2. 19:59
728x90
반응형
int main()
{
	int n1 = 0;
	int* p1 = 0; // ok. 0은 정수 이지만 포인터로 암시적 형변환 된다.
	//int* p = 10; // error. 10은 정수라도 포인터로 변환될 수 없다.

	// C++11 스타일
	// 포인터 초기화시에는 0 대신 nullptr을 사용하자
	int n2 = nullptr; // erorr
	int* p2 = nullptr; // ok
}

 

#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
#define NULL 0
#else
#define NULL (void*)0
#endif

	foo(NULL); // NULL은 이렇게 만들어 줘야함.

	goo(NULL); // void* => char* 로의 암시적 변환 필요
			// C언어 : ok, C++ 언어: 암시적 변환 안됨.

	foo(nullptr);
}

 

#include <iostream>

void foo(int n) { std::cout << "int" << std::endl; }
void foo(double n) { std::cout << "double" << std::endl; }
void foo(bool n) { std::cout << "bool" << std::endl; }
void foo(char* n) { std::cout << "char*" << std::endl; }

int main()
{
	foo(0); // int. 0은 정수형 literal
	foo(0.0); // double. 0.0은 실수형 literal
	foo(false); // bool. false은 bool형 literal
	foo(nullptr); // char*. nullptr은 포인터형 literal

	// 모든 literal은 타입이 있습니다.
	0; // int
	0.0; // double
	nullptr; // nullptr_t라는 타입입니다.
				// nullptr_t라는 타입은 모든 포인터로 암시적 형변환
				// 됩니다.

	nullptr_t a = nullptr;

	int* p = a; // ok.. a는 결국 nullptr
}
728x90
반응형

'Language > C/C++' 카테고리의 다른 글

[C/C++] const VS #define  (0) 2021.02.16
[C++] 동적 메모리/ 레퍼런스  (0) 2020.01.02
[C++] C++스타일의 캐스팅  (0) 2020.01.02
[C++] C++11/C++17 에서의 반복문/제어문  (0) 2020.01.02
[C++] 함수  (0) 2020.01.02