• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

대략 7분부터 작성하시는 Calc클래스에서

23.10.11 04:55 작성 조회수 158

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님의 프로필

Soobak

2023.10.12

안녕하세요, 답변 도우미 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 객체는 변경되지 않았기 때문에, 그대로 201 을 더한 21 이 출력됩니다.

참조 자료형과 관련해서는 강의 6.14 참조 변수 reference variable 을 참고하시면 도움이 되실 것 같습니다.