• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

연산자 오버로딩에서 this 포인터에 대한 질문입니다..

21.11.25 02:06 작성 조회수 149

0

#include <iostream>

 

using namespace std;

 

class Cents

{

private:

int m_cents;

 

public:

Cents(int cents = 0) { m_cents = cents; }

int getCents() const { return m_cents; }

// int &getCents() { return m_cents; }

 

Cents operator + (const Cents& c2)

{

return (this -> m_cents + c2.getCents());

}

};

 

int main()

{

Cents cents1(6);

Cents cents2(8);

Cents cents3(6);

 

Cents sum;

 

cout << (cents1 + cents2 + cents3).getCents() << endl;

 

return 0;

}

 

 

class Cents 객체의 멤버 함수가 되기 위해서  operator + 함수 오버로딩이 갖을 수 있는 매개변수가 한개인 것은 알겠습니다. 그러나 이 동작과정에 대해서 제대로 이해가 안갑니다. ㅠㅠ  break point를 찍어 확인해보려 하였으나, 이상하게 되더라구요 ㅠㅠ

 

제가 동작과정을 순서대로 말해 볼테니, 틀린게 있으면 말해주세요. 부탁드립니다.

 

1. main()에서 cents1 (Cents(6))객체가 실행된다.

2.  Cents 객체에서 m_cents에 6을 대입한다.

3.  여기서 이해가 안갑니다.

 

Q1. this -> m_cents 에서 이 this는 cents1의 값을 갖고 있는 건가요?

 

Q2. Q1이 맞다면 c2.getCents()에는 cents2의 값이 들어가고 있는 건가요?

 

Q3. Q1이 아니라면 처음에 this -> m_cents에는 0이라는 값이 들어가 있고cents1을 통해 c2.getCents()에 6이 들어가고  this 포인터를 통해 c2 인스턴스의 멤버의 m_cents에 6을 넣어주고  그 다음에 cents2의 인스턴스 멤버에 접근하여 8을 넣어주고 ... 이런 식으로 작동하나요?

 

 Q3를 요약하자면, this는 해당 Cents class의 하나의 주소를 갖고 있고 이를 다른 인스턴스 멤버 값을 계속 더해서 this의 멤버 변수에 넣어준 다음에, 이를 return 해주는 것일까요?

 

이해가 제대로 안되다 보니 질문하는 것도 어렵네요.. 멘토 분이 제가 무슨 말을 하는지 이해가 되실지 모르겠습니다.. break point를 여러개 찍어서 디버그를 해보아도 main문만 돌다가 이상한데로 빠지더라고요.. ㅠㅠ

답변 1

답변을 작성해보세요.

0

안소님의 프로필

안소

2021.11.25

q1. 네. this 는 cent1 객체 본인 그 자체입니다. (this 는 자기 자신을 가리키는 포인터입니다.) 

q2. 이 말씀은 이해가 잘 안되네요 ㅠ.. c2 에서 호출한거니까 이 때의 m_cents 는 c2 본인의 m_cents 입니다.

q3 q4 이건 아닙니다

클래스는 설계도일 뿐이구요. 객체들은 이 설계도를 가지고 만들어낸 실존하는, 개성있는 여러 건물이라고 생각해주시면 됩니다. 그러니까 저 Cents 는 설계도일 뿐이구요, cents1, cents2, cents3 는 저 설계도를 가지고 만들어낸 객체입니다. 서로 메모리가 다른 별개의 존재일 뿐입니다. (모두 다 공통적으로 m_)cents 라는 속성을 가지고 있고 (물론 값은 다 개개인마다 다름. 모든 사람이 이름이라는 속성은 가지고 있지만 그 값은 다 다른 것 처럼)  getCents 라는 기능을 가지고 있다는 공통점이 있음)  cents1, cents2, cents3 은 서로 내용과 생김새는 다를 수 있지만 Cents 라는 공통점을 가지고 있기 때문에 기능과 속성은 같습니다.  이런식으로 oop 를 이해해주시면 질문자님의 질문들 해결 가능합니다. 

그리고 디버깅 할 때 main 문에서만 돌고 있다고 하신거보니까 

가운데 화살표 버튼 누르신 것 같네요. (이걸 누르면 타고 들어가지 않고 한 줄 단위로 넘어가듯 실행되기 때문에 이걸 누르면서 디버깅 하셨으면 main 에서마 ㄴ도는게 당연해요.) 맨 왼쪽 한단계씩 코드 실행 화살표를 눌러서 디버깅 해주시면 됩니다.

이준우님의 프로필

이준우

질문자

2021.11.25

중단점을 찍어 확인해보고 싶은데요. 앞서 말씀해주신 F11을 사용해서 해보는데 결과는 같습니다. ㅠㅠ 과정은 다음과 같아요.. 왜 main 문에서 class로 안가고 return을  지나면 .ini 파일이 실행되는지 모르겠습니다.ㅠㅠ  class쪽에다 breakpoint를 찍어도 같은 상황이 발생합니다. 

즉, class 내부에서 동작하는 과정을 보고 싶은데 그게 안되네요

이준우님의 프로필

이준우

질문자

2021.11.25

죄송합니다. release 모드여서 그런거였네요. 바보였네요