210114 목요일 연산자 오버로딩 복습
쓸일은 거의 없겠지만
#include <iostream>
using namespace std;
int main() {
int num = 5;
(num++)++;
++(++num);
}
겉으로 보기에는 아무 문제 없어보이는 코드이지만 빨간줄이 그이는 코드이다
바로 여기
(num++)++;
빨간줄에 커서를 올리면 '식이 수정할 수 있는 lvalue 여야 합니다' 라는 툴팁이 뜨고
컴파일 시 '++ 에 lvalue 가 필요합니다' 라는 에러를 볼 수있다.
결론을 먼저 말하자면
증감연산자는 rvalue가 아닌 lvalue를 기준으로 연산을 진행한다.
그래서 증감연산자의 피연산자는 lvalue 여야한다.
... ㅇ3ㅇ
뭔말인지 하나도 모르겠다
우선 lvalue와 rvalue가 뭔지부터 알아야겠다
lvalue 와 rvalue 에 대한 설명은 여기를 보도록 하자
effort4137.tistory.com/entry/Lvalue-Rvalue
아래서부턴 내가 나름대로 정리해본것
연산자는 더하기 빼기 나누기 곱하기
피연산자는 연산의 대상이 되는 변수나 상수
5 + x = 10
여기서 연산자는 '+' 이고
피연산자는 5 와 x
10은 연산의 결과
C++의 연산에서
전위증가는 피연산자에 대해 증가연산을 하면서 그 피연산자의 메모리를 참조하는 lvalue를 리턴한다
후위증가는 피연산자에 대해 증가연산을 하면서 증가 연산 진행 전의 rvalue를 리턴한다
쉽게 말하면 num 을 전위증가 했을때는 num을 참조할 수 있는 레퍼런스를 리턴해주고
num을 후위증가 했을 때는 num에 저장되어있는 숫자값만 달랑 넘겨준다는 것이다
그래서
#include <iostream>
using namespace std;
int main() {
int num = 5;
++(++num);
}
++(++num);
괄호 안 ++num 수행 결과
6을 참조하는 lvalue를 리턴해서 그다음 전위증가 연산을 할 수 있다
#include <iostream>
using namespace std;
int main() {
int num = 5;
(num++)++;
}
(num++)++;
괄호 안 num++ 수행 결과로 6이라는 rvalue를 리턴하며
6++; 이라는 코드가 된다.
그래서 후위연산자의 피연산자가 lvalue이 아닌 상수(6) 가 되기 때문에 에러가 발생한다.
증감연산자는 rvalue가 아닌 lvalue를 기준으로 연산을 진행하기 때문에
피연산자는 lvalue 여야 하니까
그래서 전위연산자, 후위연산자를 오버로딩 할 때 특히 후위연산자를 오버로딩 할때는
함수의 반환형을 const 로 선언해서 반환 시 생성되는 임시객체를 const 객체로 만든다. (상수화)