작성
·
279
1
}Calc(int init_value)
: m_value(init_value)
{}
Calc& add(int value)
{
m_value += value;
return *this;
}
Calc& sub(int value)
{
m_value -= value;
return *this;
}
Calc& mult(int value)
{
m_value *= value;
return *this;
}
Calc& add, Calc& sub ,Calc& mult에서
&를 지워도 오류가 안나더라구요
Calc add(int value)
{
m_value += value;
return *this;
}
Calc sub(int value)
{
m_value -= value;
return *this;
}
Calc mult(int value)
{
m_value *= value;
return *this;
}
&만 지우고
int main()
{
{
Calc cal=10;
cal.add(10).sub(1).mult(2).print(); //38
cal.add(1).print();//21
return 0;
}
};
돌렸는데 38로 값이 똑같이 나왔어요
차이가 뭐지? 생각이 들어서
add를 한번 더 했는데 21이 나오더라구요
디버깅해보니까 20으로 시작하는 걸로 나오는데
이유를 모르겠어서요
차이가 뭘까요?
답변 1
1
안녕하세요, 답변 도우미 Soobak 입니다.
함수의 반환형에 차이가 있기 때문입니다.
첫 번째 코드에서 함수들은 Calc&
형태로 객체의 참조를 반환합니다.
즉, 같은 객체를 계속 참조하면서 연산을 합니다.
두 번째 코드에서 함수들은 Calc
형태로 객체의 복사본을 반환합니다.
Calc&
을 반환형으로 할 때(참조 반환), cal.add(10).sub(1).mult(2)
는 cal
객체 자체를 계속 업데이트 합니다.
Calc
을 반환형으로 할 때(복사본 반환), cal.add(10)
은 cal
의 복사본에 10
을 더한 새로운 객체를 반환한 후 sub(1)
으로 새로운 객체에서 1
을 뺍니다. 하지만, 원래의 cal
객체는 변하지 않습니다.
따라서, cal.add(10).mult(2).print();
를 실행하면, 두 코드 모두 같은 결과를 얻습니다.
하지만, cal.add(1).print();
의 경우,
참조 반환에서는 원래의 cal
객체에 1
을 더하므로 39
가 출력됩니다.
복사본 반환에서는 원래의 cal
객체는 변경되지 않았기 때문에, 그대로 20
에 1
을 더한 21
이 출력됩니다.
참조 자료형과 관련해서는 강의 6.14 참조 변수 reference variable 을 참고하시면 도움이 되실 것 같습니다.