헤더파일

c++ 변환 연산자, 변환 생성자 본문

C++

c++ 변환 연산자, 변환 생성자

헤더파일 2020. 3. 23. 18:34
class Point
{
	int x, y;
public:
	Point()             : x(0), y(0) {}
	Point(int a, int b) : x(a), y(b) {}
	Point(int a) : x(0),y(a){}
	// 변환 연산자 : 객체를 다른 타입으로 변환할때 호출된다.
	// 특징 : 리턴 타입을 표기하지 않는다.
	operator int()
	{
		return x;
	}
};

int main()
{
	int    n = 3;
	double d = n; // 암시적 형변환 발생.

	Point p1(1, 2);
	n = p1;		// p1.operator int()
    	cout << n << endl; // 1
    p1 = n;

	cout << n << endl; // 0
    
}

사용자 정의 객체를 다른 자료형의 변수에 대입하려면 operator 자료형 () 형태의 변환연산자를 정의 하여야 합니다.

 

다른 자료형의 변수로 사용자 정의 객체를 생성하고자 한다면 해당 자료형을 인자로 받는 생성자를 만들어야 합니다. 이를 변환생성자라고 합니다.

 

하지만 이런 변환생성자들로 인해 의도않은 객체 생성이나 임시객체를 복사생성자를 사용해서 복사하는 과정을 거치게 됩니다. 변환 생성자를 사용하는 것을 막고 싶다면 앞에 explicit 을 추가하여 막을 수 있습니다.

 


nullptr

nullptr 은 내부적으로 아래 구조체를 구현하여 만들었습니다.

 

truct xnullptr_t
{
	//operator void*() { return 0; }
	//operator char*() { return 0; }
	template<typename T>
	operator T*() { return 0; }
};
xnullptr_t xnullptr; // 포인터 0

c++에서는 void*  에서 다른 포인터 자료형으로 암시적 형변환이 되지않아 NULL을 포인터 초기값으로 쓴다면 함수에 인자로 넘겨 줄 때 불편함이 있을 수 있습니다. C++11 부터는 위 처럼 nullptr이 구현되어 있으므로 사용하는 게 좋습니다.

'C++' 카테고리의 다른 글

c++ Brace Init  (0) 2020.03.25
C++ Explicit Conversion Operator  (0) 2020.03.25
C++17 if 초기화, if constexpr, 구조체 바인딩  (1) 2020.03.23
c++ Trivial  (2) 2020.03.19
C++ name mangling  (0) 2020.03.11
Comments