Lime Leaf MYPI

Lime Leaf
접속 : 7496   Lv. 97

Category

Profile

Counter

  • 오늘 : 27 명
  • 전체 : 244768 명
  • Mypi Ver. 0.3.1 β
[잡담] C++ 연산자오버로딩 관련해서 질문있습니다. (13) 2019/03/29 AM 11:09

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

 

 

 

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와 반환형만 조금 다르고 나머지는 같은데 어떻게 구분되고 있는 건가요?

 

 

 

 

신고

 

Lifeisbeaten    친구신청

반환형도 다르고const도 달려 있으니 다르죠...

Lime Leaf    친구신청

오버로딩은 이름하고 인수만 비교하는 거 아닌가요?

Lifeisbeaten    친구신청

arr 내부에 담는 자료형이 포인터 같은데 맞나요?

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

Lime Leaf    친구신청

네, 맞습니다.


typedef Account * ACCOUNT_PTR;

private:
/ ACCOUNT_PTR * arr;
/ int arrlen;

Lifeisbeaten    친구신청

배열은 본래 주소값이고 &는 참조라는 것

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

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

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

에 접근하는거라고 보시면 됩니다.
사실 요즘엔 저런 패턴으로 잘 안쓰죠 저럴꺼면 그냥 STL 컨테이너에 담는게 깔끔해요.

Lime Leaf    친구신청

예제에 오류가 있는거라고 생각하면 되려나요?
둘 중 하나는 작동을 안하고 있을 거 같긴 한데.

Lifeisbeaten    친구신청

사용해 보시면 알텐데...
반환값을 받아서 주소를 출력해보시면 좀더 명확하게 알겁니다.

아라라기군    친구신청

조금 다르다->정확히 다르다 :)

돼지한텐나라도법도없어    친구신청

조금 다르다 x 완전히 다르다 o

돼지한텐나라도법도없어    친구신청

object 와 object* 와 object& 는 다른것입니다

aksiz    친구신청

C++잘 모르긴 한데, 잠깐 검색해 본걸로 봐서는 반환형보다는 const가 중요한 걸로 보이네요.
https://www.geeksforgeeks.org/function-overloading-and-const-functions/

const 로 각 함수를 구분하나 보네요.

Lime Leaf    친구신청

알고보니 const 함수에서 부를 때는 const 함수를 우선적으로 오버로딩 하는 거였더군요.
저도 방금 알아냈습니다.
답변 감사드립니다.

루리웹-2898369589    친구신청

오버로딩 같은 기능 있다고 꼭써야한는거 아닙니다. 함수, 클래스 많아지기 시작하면 정신못차리게됨
X