연산자 오버로딩에 대해서 보다가 Const위치에 따른 영향이 헷갈려서 포스트를 올립니다.
(출처: https://ally10.tistory.com/24)
const Point operator+(const Point& target) const
{
Point ret;
ret.x = this->x + target.x;
ret.y = this->y + target.y;
return ret;
}
Point A, B;
Point C = A+B; 와 같은 연산을 위한 오버로딩입니다.
function name앞의 const는 A+B의 결과물인 임시 객체가 C로 할당되기까지 변하지 않는다는 의미이며,
파라미터에 붙은 const는 피연산자에 대한 정의입니다.
즉 A+B에서 B가 피연산자이므로, B가 변하지 않는것을 보장합니다.
마지막으로 함수 뒤 const는 클래스 내부에서 유효한것으로, 객체 A에 대한 정의이다. 즉, this로 통하는 모든 변수는 해당 함수내에서 "수정될 수 없다"라는 의미입니다. =이 함수는 멤버 변수의 값을 수정하지 않는다.
수정을 해보려고 해도, 컴파일 에러가 납니다.
(출처: http://egloos.zum.com/chideout/v/4158795)
const[1] data-type operator operator-name (const[2] operand) const[3] { function activity ... }
(ex) const Time operator + (const Time&) const { 임시 Time 객체를 이용하여 처리한 뒤 임시 객체를 반환 }
여기서 const는 총 3번 사용되었으며, 각각의 const는 다 쓰임이 다르다.
여기서는 시간 데이터를 저장하는 자료형 Time을 가정하여, Time 객체끼리의 더하기 연산을 오버로딩하는 상황을 가정해보겠다. 즉, Time 객체 A,B,C가 있다고 가정할 때, A=B+C; 같은 문장이 유효하게끔 하는 처리이다.
[3] 위의 연산자는 클래스 메소드로서 연산자를 정의한 것이다. 따라서 이 const가 영향을 미치는 것은 {} 내에서 활동하는 호출 객체에 영향을 미치는 것이다. 즉 B+C라는 수식이 있다면, B에 영향을 미치는 것이 [3]의 const이다. 호출 객체의 값이 method 실행 과정에서 수정되는 일이 없도록 제한을 걸어준다.
[2] 피연산자에 영향을 미치는 const이다. 즉 B+C라는 수식이 있다면, C에 영향을 미치는 것이 [2]의 const이다. 일반적으로 피연산자는 매개변수로서 넘어올 때 레퍼런스(&)로 넘어오기 때문에 값이 수정될 가능성이 있다. 따라서 const를 걸어줌으로써 값이 수정될 여지를 없애주는 것이다.
[1] 연산이 완료된 뒤 반환(return)되는 값이 수정되지 않도록 해준다. 즉 B+C라는 수식이 있다면, (B+C) = 5; 와 같은 수식이 성립되지 않도록 하는 것이다. 위에 예시에 적었듯이 연산이 완료된 뒤에 반환되는 것은 임시 객체, 즉 변수이다. 지역 변수이기에 오류인 것은 두말할 것도 없고, 설사 전역 변수가 반환된다고 할 지라도 쓰기가 안되게 만들어야 연산 결과를 보장할 수 있다.
오버로딩을 다룰 때에도 const를 제대로 이해해야 실수를 해놓고도 왜 틀렸는지 이해가 안 되는 불쌍사를 미연에 방지할 수 있다.
'C++ > 기타' 카테고리의 다른 글
[C++] 소숫점 고정해서 출력하기 (0) | 2022.09.05 |
---|---|
[C++] string의 신기한 사용법 (0) | 2022.09.04 |
[C++] 배열을 매개변수로 받는 다양한 방법 (0) | 2022.08.23 |
friend 클래스와 함수 (0) | 2022.07.21 |