• [잡담] C++ 연산자오버로딩 관련해서 질문있습니다.2019.03.29 AM 11:09

게시물 주소 FONT글자 작게하기 글자 키우기

[]를 연산자오버로딩하는 예제의 일부인데요.

 

 

 

public:

ACCOUNT_PTR& operator[] (int idx);

ACCOUNT_PTR operator[] (int idx) const;

 

 

 

 

ACCOUNT_PTR& BoundCheckAccountPtrArray::operator[] (int idx)

{

if(idx<0 || idx>=arrlen)

{

cout<<"Array index out of bound exception"<<endl;

exit(1);

}

return arr[idx];

}


ACCOUNT_PTR BoundCheckAccountPtrArray::operator[] (int idx) const 

{

if(idx<0 || idx>=arrlen)

{

cout<<"Array index out of bound exception"<<endl;

exit(1);

}

return arr[idx];

}

 

 

 

 

저 두 함수가 const와 반환형만 조금 다르고 나머지는 같은데 어떻게 구분되고 있는 건가요?

 

 

 

 

댓글 : 13 개
반환형도 다르고const도 달려 있으니 다르죠...
오버로딩은 이름하고 인수만 비교하는 거 아닌가요?
arr 내부에 담는 자료형이 포인터 같은데 맞나요?

그럴때나 의미있어 보이는 반환형 구문이긴 하네요.
네, 맞습니다.


typedef Account * ACCOUNT_PTR;

private:
/ ACCOUNT_PTR * arr;
/ int arrlen;
배열은 본래 주소값이고 &는 참조라는 것

두번째 오버라이딩은 자료형 그자체를 리턴하는거고
첫번째는 배열 내부에 존재하는 엘레멘탈의 주소값을 리턴하는거라고 보시면 됩니다.

구분해서 써야할 이유가 있어 보이는 구문이긴 해요.

배열[1] = new XXXX();
배열[2] = new XXXX();
배열[3] = new XXXX();
배열[4] = new XXXX();
배열[5] = new XXXX();

에 접근하는거라고 보시면 됩니다.
사실 요즘엔 저런 패턴으로 잘 안쓰죠 저럴꺼면 그냥 STL 컨테이너에 담는게 깔끔해요.
예제에 오류가 있는거라고 생각하면 되려나요?
둘 중 하나는 작동을 안하고 있을 거 같긴 한데.
사용해 보시면 알텐데...
반환값을 받아서 주소를 출력해보시면 좀더 명확하게 알겁니다.
조금 다르다->정확히 다르다 :)
조금 다르다 x 완전히 다르다 o
object 와 object* 와 object& 는 다른것입니다
  • aksiz
  • 2019/03/29 PM 12:08
C++잘 모르긴 한데, 잠깐 검색해 본걸로 봐서는 반환형보다는 const가 중요한 걸로 보이네요.
https://www.geeksforgeeks.org/function-overloading-and-const-functions/

const 로 각 함수를 구분하나 보네요.
알고보니 const 함수에서 부를 때는 const 함수를 우선적으로 오버로딩 하는 거였더군요.
저도 방금 알아냈습니다.
답변 감사드립니다.
오버로딩 같은 기능 있다고 꼭써야한는거 아닙니다. 함수, 클래스 많아지기 시작하면 정신못차리게됨
친구글 비밀글 댓글 쓰기