2013-10-17 2 views
0

기본적으로 기본적으로 단일 링크 된 목록을 디자인 할 때 몇 가지 문제가 발생했습니다. 는 여기에 내가 STL 컨테이너에서 본 적이C++ 함수 오버로드

struct Node { 
    int val; 
    Node* next; 
}; 

struct SinglyLinkedlist { 
    int size; 
    Node* head; 
    SinglyLinkedlist(); 

    const Node* Begin() const { 
    printf("const begin\n"); 
    if (size > 0) 
     return head->next; 
    } 

    Node* Begin() { 
    printf("begin\n"); 
    if (size > 0) 
     return head->next; 
    } 
}; 

선언, 예를 들어 표준이다 :: 큐, 같은 이름의 기능을 할 수 있음을 다음과 같이 공존

//std::queue 
value_type& front(); 
const value_type& front() const; 

그것이 나를 붙 잡았다 왜냐하면 같은 이름을 가진 함수 나 함수 오버로딩을 만들지 않았기 때문입니다. 예를 들어, 같은 이름이지만 다른 인수 유형을 가진 함수. 따라서 이것이 내가 모르는 함수 오버로딩인지 또는 다른 종류의 함수인지 궁금합니다. 그리고 런타임에 호출 할 Begin()을 프로그램에서 어떻게 알 수 있습니까? 컴파일러가 컨텍스트에서 CONSTNESS를 감지하고 호출 할 것을 결정할 것이라고 생각합니까? 내가 가진 또 다른 문제는 명시 적으로 * 연산자, * Begin() 예 Node * dereferenced 및 출력 값을 기본적으로 Begin() -> val과 같은 출력하지 않고 * 연산자가이 기능을합니다 어쨌든 고맙습니다. 당신의 const Node* Begin() const 방법에 관한

int main() 
{ 
    SinglyLinkedlist l; 
    l.Push(1); 
    l.Push(2); 
    l.Push(3); 

    l.PrintList(); 
    printf("%d\n",*l.Begin()); //print out 1 same as l.Begin()->val 
} 

답변

1

예, 참조 및 const 참조는 두 가지 유형입니다. 컴파일러는 컨텍스트에 따라 const 선언을 선택합니다.

Node를 참조 해제하면 struct Node가 생기고 printf의 % d이 (대부분의 컴파일러에서) 4 바이트를 가져와 int로 처리합니다. 구조체의 멤버 순서를 변경하면 출력이 변경됩니다.

+0

... 무엇인지 이해 double, 최종 printf (% d)는 쓰레기 값을 줄 것입니다! 감사 –

0

, this question를 참조하십시오.

본질적으로이 메서드는 개체가 변형되지 않으므로 상수 인스턴스에서 호출 할 수 있습니다.

그래서 이론적으로,이 작업을해야합니다 : 결과가리스트의 돌연변이 때문에

int main() { 
    SinglyLinkedList lst; 
    const SinglyLinkedList clst; 

    lst.Push(1); 
    lst.Push(2); 
    clst.Push(3); 
} 

모순된다. 그러나 수정은 실제 SinglyLinkedList이 아닌 Nodes으로 수행됩니다.

정보 *operator : 제대로 작동하고 있습니다. 객체에 대해서만 특별한 동작이 없습니다.

당신이 반환 유형에 따라 과부하 수 없습니다 ++ C에서
+0

이 잠깐, 나는 지금은'* '연산자에 대한 귀하의 질문에 내가이기 위하여 발 유형을 변경한다면 당신은 절대적으로 옳다 – Kiruse

0

,하지만 당신은 이력서 - 예선에 과부하 수 있습니다

오버로드 해상도에 참여하는 기능 (13.3)에 대한 정보 : 해당 매개 변수 형 -list (8.3.5)와 함수가 클래스 멤버 인 경우 함수 에있는 cv 한정자 (있는 경우)와 멤버 함수가 선언 된 클래스가 있어야합니다. [...]

Cv-qualifiersconst는, volatilemutable이다.

두 함수가 모두 동일한 반환 유형 (Node*)을 가지지 만 cv 한정자가 다르므로 과부하가 허용됩니다.

0

const 함수 오버로드에 대해 읽어야합니다. Const 함수와 non-const 함수는 서로 다릅니다. 예를 들어 const 타입이 필요하고 때때로 const 타입이 아닌 다른 장소에서 사용하려고한다면 에러를 발생시키지 않도록 두 함수가 필요합니다. 이 예에서

봐 : link