*다시 정의할 수 있는 연산자 / 없는 연산자
=> 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 |