About C++ – “포인터 객체, 화살표(‘->’ 간접참조연산자) 연산자, 직접참조연산자란?”

About C++ – “포인터 객체, 화살표(‘->’ 간접참조연산자) 연산자, 직접참조연산자란?”

2021/11/13 10:23 AM

포인터 복습

#include <iostream>
int main(void) {
  int x = 100; // 정수형 변수 x를 선언하고, 100을 대입했습니다.
  int y; // 정수형 변수 y를 선언했습니다.

  int *PointerX; // 포인터형 변수 PointerX를 선언했습니다.
  PointerX = &x; // PointerX 안에 X의 주소를 대입했습니다.
  y=*PointerX; // 참조 연산자(*)를 사용하여 포인터의 주소로 가서 값을 가져왔습니다.

  std::cout << y;

  return 0;
}

포인터를 간단히 https://www.gdsanadevlog.com/668 에 정리해두었습니다. 위의 코드를 이해하시기는 어렵지 않을 것입니다.

포인터 객체로 알아보는 직접참조연산자, 간접참조연산자란?

클래스에서도 포인터 객체를 만들 수 있습니다. 위의 코드에서 int형의 포인터객체 PointerX를 만든 것과 같은 맥락입니다.

#include <iostream>
using std::cout;

class Fish{
  private:
    float length;
  public:
    float getLength(){return length;}
    void setLength(float a){length = a;}
};

Fish클래스 정의부분인데, 위의 코드는 전혀 이해하기 어렵지 않을 것입니다.

main함수를 자세히 살펴보겠습니다.

int main()
{
  Fish discus, *pdiscus;
  pdiscus = &discus;

  discus.setLength(15.3452);
  //  cout<<discus.getLength(); 이면,
  // error: member reference type 'Fish' is not a
  // pointer; did you mean to use '.'?
  // 포인터 객체가 아니므로 '.' 직접참조연산자를 사용해야 한다는 오류 메시지가 나옵니다.
  cout<<discus.getLength();

  cout<<"\n";

  pdiscus->setLength(11.5);
  //pdiscus.setLength(11.5); 이면,
  //error: member reference type 'Fish *' is a pointer;
  //did you mean to use '->'?
  //포인터 객체이므로 '->' 간접참조연산자를 사용해야 한다는 오류 메시지가 나옵니다..
  cout<<pdiscus->getLength();

  return 0;
}

Fish클래스의 일반객체인 discus와 포인터객체 pdiscus를 만들었습니다. 다음 줄에서, 주소값을 저장할 수 있는 포인터객체인 pdiscus에 discus의 주소값을 대입한 것을 알 수 있습니다.

discus.setLength(15.3452); 는 직접참조연산자인 ‘.’를 이용한 예시입니다. 일반객체인 discus가 멤버에 접근하기 위해서 직접참조연산자를 사용한 것을 볼 수 있습니다. 다음줄인 cout<<discus.getLength(); 에서도 직접참조연산자를 사용한 것을 확인할 수 있습니다.

이번엔 pdiscus->setLength(11.5);의 경우를 살펴봅니다. pdiscus는 포인터 객체이므로 간접참조연산자인 ‘->’를 사용하여 멤버에 접근한 것입니다. 당연히 다음줄에서도 포인터객체가 멤버에 접근하기 위해서 간접참조연산자를 사용한 것을 알 수 있겠습니다.

간접참조연산자( ‘->’ ) vs 직접참조연산자( ‘.’ )

  • 간접참조연산자는 포인터 객체가 멤버에 접근하기 위해 사용합니다.
  • 직접참조연산자는 일반 객체가 멤버에 접근하기 위해 사용합니다.

Thank you for visiting!

Thank you for visiting!

If you found this post helpful, please consider sharing and liking it. If you have any questions, feel free to leave a comment. 😎

If you’d like to contact me personally, please use the button below to send me an inquiry email. 📧