2010-08-04 4 views
2

C++의 메소드의 const 버전과 non-const 버전 간의 구분에 관한 몇 가지 질문이 있습니다.C++의 메소드의 const 버전과 non-const 버전의 차이점

예 :

 MyObject* MyClass::objectReference() 
const MyObject* MyClass::objectReference() const 

내 질문

은 다음과 같습니다

  1. 수동으로 호출되는 방법의 버전을 구별하는 전혀 방법이 있나요? 또는 완전히/완전히 자동입니까? 그렇다면 정확도 인은 어떤 버전을 호출 할 지 결정하는 규칙입니까?
  2. (1)과 관련하여 const 버전과 non-const 버전을 구별 할 수 없다면 중복 버전을 방지하기 위해 한 버전의 메소드를 다른 버전에서 호출 할 수 없습니까?
  3. doxygen을 사용하는 방법 중 하나의 문서에서 한 버전 또는 다른 링크에 대한 링크를 만드는 방법은 무엇입니까? (예 : "myMethod()의 const 버전"또는 "myMethod()의 비 const 버전") 자신을 발견했습니다. 메소드 서명의 끝에 "const"를 추가하거나 생략하십시오.
+1

전 * 다른 질문 - 마지막은 Doxygen 특정, 전 일반적인 C + + 질문하는 것이 좋습니다. # 1 *과 * # 2를 더 잘 사용할 수도 있습니다. –

+0

# 2는 문제의 대상이 'this'가 가리키는 # 1의 특별한 경우입니다. 나는 # 3이 자신의 질문을 가져야한다고 분명히 동의한다. – bcat

+0

@bcat : 글쎄, 따라서 * * ​​* - 구현 공유는 그 자체로 흥미로운 문제입니다. [# 1] (http://stackoverflow.com/questions/407100/calling-a-const-function-from-a -non-const-object), [# 2] (http://stackoverflow.com/questions/1333849/how-to-generate-a-non-const-method-from-a-const-method), [# 3] (http://stackoverflow.com/questions/856542/elegant-solution-to-duplicate-const-and-non-const-getters), ... :) –

답변

5

doxygen에 대해 알고 싶지 않습니다. 여기 내가 알고있는 것이 있습니다. 단지 비 const 버전이 있다면

  1. , 그것은 단순히 const 개체에서 호출 할 수 없습니다.
  2. const 버전 만있는 경우 constconst 개체 모두에서 호출 할 수 있습니다.
  3. 둘 다있는 경우 비 const 버전은 비 const 개체에서 호출되며 const 버전은 const 개체에서 호출됩니다. 아마 현명하지 않은 const 인스턴스에서 비 const 메서드를 호출 static_cast<const MyClass&>(myObject).objectReference();
+1

'const_cast'를 대신 사용 하시겠습니까? – Anthony

+4

@Duracell :'static_cast'가 그것을 추가 할 때 훌륭한 역할을하기 때문에'const_cast'를'const_cast'를 제거하기 위해서만 사용하고 싶습니다. – zneak

+3

@Duracell @zneak : 이것은 [implicit_cast' 함수 템플릿]에 대한 좋은 사용 사례입니다. (http://stackoverflow.com/questions/868306/what-is-the-difference-between-static-cast-and- 암시 적 - 캐스트/869597 # 869597). –

1

동안 : 당신이 명시 적으로 const 하나를 호출 할 경우

  • , 당신은 자신의 const를 기준으로 개체를 캐스팅해야 . 그러나 const 메소드를 const 인스턴스가 아닌 인스턴스에서 호출하려는 경우 캐스트 만 사용하십시오. 예를 들어, 다음 프로그램을 참조하십시오 :

    #include <iostream> 
    
    class ConstTest { 
    public: 
        void cows() const { 
        std::cout << "const method call" << std::endl; 
        }; 
    
        void cows() { 
        std::cout << "non-const method call" << std::endl; 
        } 
    }; 
    
    int main() { 
        ConstTest ct; 
    
        ct.cows();         // Prints "non-const method call" 
        static_cast<const ConstTest &>(ct).cows(); // Prints "const method call" 
    } 
    
  • 관련 문제