프로그래밍/C++

#44. 연산자 오버로딩

코딩하는상후니 2022. 7. 20. 22:02

 
*다시 정의할 수 있는 연산자 / 없는 연산자
=> operator*( ) 재정의 가능함.

 

 

 

 

*연산자 vs 함수
=> 연산자는 피연산자의 개수가 상관이 없다.
 
b++;  => ( 피연산자 1개 )
++b; => ( 피연산자 1개 )
a + b => ( 피연산자 2개 )
 
 
 
*연산자 오버로딩
연산자 함수도 두 가지 방식으로 만들 수 있음.
=> 모든 연산자를 다 오버로딩 할 수 없음.
 
 
 
*멤버 연산자 함수 version
 
pos3 = pos1 + pos2
=> pos1.operator+(pos2)
 
a op b 형태에서,
a => '기준 피연산자' 라고함.
한계  :  a(왼쪽) 가 클래스가 아니면 사용 못함.
 
pos4 = 5 + pos3  => ( X )
해결책  :  전역 연산자 함수 version
 
Pos operator+(int num, const Pos& other) 
{ 
	Pos Ret; 
	Ret._y = num + other._y; 
	Ret._x = num + other._x; 
	return Ret; 
}
 
 
*무엇이 더 좋은가 ??
=> 그런거 없음. 둘 다 사용할 줄 알아야 함.
 
대입연산자 ,  전역 연산자 방식으론 못 만든다.
=> 문법적으로 막아둠.
=> 전역 연산자는 기준 피연산자가 클래스가 아닐 때 사용해야하는데,
대입 같은 연산자(왼쪽이 클래스) 를 전역으로 풀어버린다면 반대의 상황이 발생
즉, 클래스끼리 연산되어질 수 있음.
 

 

 

 

 

*대입연산자
Pos& operator=(int Num)
{
	_y = Num;
	_x = Num;
	return *this;
}
 
 
*복사대입연산자
Pos& operator=(const Pos& other)
{
	_y = other._y;
	_x = other._x;
	return *this;
}
 

 
*( 클래스 안 )
bool operator==(const Pos& other)
{
	return (_y == other._y && _x == other._x);
}
 
 
*( 클래스 밖 )
bool operator==(int num, const Pos& other)
{
	return (other._y == num && other._x == num);
}
 

 
*증감 연산자

 

=> ( 전위형 )
Pos& operator++()
{
	_y += 1;
	_x += 1;
	return *this;
}
 
=> ( 후위형 )
Pos operator++(int)
{
	Pos pos = *this;
	++(*this);
	return pos;
}​
 
 

 

 

Pos& operator=(Pos& other) 
{ 
	_y = other._y; 
	_x = other._x; 
	return *this; 
}

Pos operator++(int) 
{ 
	Pos pos = *this; 
	++(*this); 
	return pos; 
}


Pos pos4; 
Pos pos5; 
pos5 = pos4++;
 
 
*왜 에러가 날까 ??, 무엇이 문제인가 ??
pos4++ 은 임시객체를 전달하는데 pos5 대입은 Pos& 값을 받아서
임시객체를 참조값으로 받는다. 이것은 참조값이 nullptr 이 될 수 있기 때문
대입에 연산자에서는 const 를 붙여 다른 객체를 읽는 용도로만 쓰자.
즉, Pos& 로 인자를 받으면 임시객체를 참조하지 못하는 현상 발생.
 

 

본 내용은 인프런의 루키스님 강의를 듣고 정리한 내용입니다.

'프로그래밍 > C++' 카테고리의 다른 글

#46. 타입변환  (0) 2022.07.20
#45. 동적할당  (0) 2022.07.20
#43. 초기화 리스트  (0) 2022.07.20
#42. 다형성 virtual  (0) 2022.07.19
#41. 은닉성  (0) 2022.07.19