2013-04-18 2 views
2

저는 C++을 배우기 시작했습니다. 자바 환경에서 전환했습니다. 저를 혼란스럽게 두 가지가 있습니다const 키워드 및 중복 메소드 서명

const char* data() const 
{ 
    return data_; 
} 

char* data() 
{ 
    return data_; 
} 

: 일부 부스트 예제를 통해 읽을 때

나는 클래스에 정의 된 다음 두 가지 방법을 발견했다.

먼저 내가 여기에 이해 생각 예약어 const이다. 첫 번째 constchar*을 가리키며 포인터의 값을 변경할 수 없습니다. 두 번째 const은 함수 호출은 내가 호출하는 객체의 상태를 변경하지 않는다고 알려줍니다. 그게 정확한 해석입니까? 하나는 같은 이름과 서명이 두 가지 방법이 왜 혼란의

두 번째 지점입니다. 컴파일러는 어떤 함수를 호출 할 것인지 어떻게 알 수 있습니까? data()에 전화 한 후 데이터를 변경할 수 있는지 여부를 알지 못하면 어떻게 알 수 있습니까?

+8

당신은'const char *'와'char * const'을 혼동합니다. –

+1

후행하는'const'는 과부하 해결에 사용됩니다. 두 가지가 필요합니다. 첫 번째 만 가지고 있다면? 'data_'는 수정할 수 없습니다. 만약 당신이 두 번째 만 가지고 있다면? 당신은 const 객체에서 호출 할 수 없습니다. – chris

+0

@KerrekSB ouch .. C++에서 단어를 신중하게 선택해야하며, 내가 사용하는 순서도주의 깊게 선택해야합니다. 나는 이미이 언어를 좋아하기 시작한다. – DeltaLima

답변

5

첫 번째 함수는 일정 데이터에 대한 포인터를 리턴한다. 함수 시그니처의 끝에있는 const은 함수가 데이터 멤버를 수정하고 클래스 화하지 않음을 나타냅니다.

번째 함수는 가변 데이터에 대한 포인터를 리턴한다. 호출자는 포인터를 사용하여 클래스 멤버 변수를 수정할 수 있습니다.

는 "CONST 정확성"에 대한 웹 및 SO를 검색 할 수 있습니다.

+0

설명과 검색어 "const correctness"에 감사드립니다.읽을 좋은 정보가 많이 있습니다. – DeltaLima

+0

질문에 대한 답이 있으면 확인 표시를 클릭하십시오. –

+0

여전히 const 정확성 질문을 읽는 중입니다. 긴 저녁을 앞두고 ... – DeltaLima

1

는 포인터 변수 내에서 const를 선언하는 방법은 여러 가지가 있습니다 문제에 관해서는

const char * // you can modify the pointer, not the item pointed to 
char const * // you can modify the pointer, not the item pointed to 

char * const // you can modify the item pointed to, not the pointer 

const char const * // you cannot modify either 
char const * const // you cannot modify either 
const char * const // you cannot modify either 

,이 두 방법의 정의는 오버로드가 있으며, 어느 것은 상황에 따라이라고합니다. 호출자가 const 방법도, 그리고합니다 (data() 메서드가 클래스의 인스턴스이다) 그것의 멤버 중 하나에 전화를 걸 경우 예를 들어, 다음 const char * data() const 메서드가 호출되고, 발신자는 절약 할 수 있습니다 유형은 const char * 인 변수의 리턴 값. 다음은 그 예입니다.

class MyClass { 
    DataClass data_obj_; // has both 'data()' methods described in your question 
... 
    void my_method() const { // within this const method, data_obj_ cannot be modified 
    const char * data = data_obj_.data(); // calls const method 
... 
+0

감사합니다. Tom, 귀하의 게시물은 처음에는 약간의 모순점 이었지만, 약간의 편집을 마친 후에는 좋은 귀중한 게시물이되었습니다. – DeltaLima

+0

@DeltaLima - 감사합니다! 나는 원래 당신의 질문을 잘못 읽었고, 나는 지금이 질문을 여러 차례 받았으며 항상 정보를 찾아야 만한다. – Tom

+1

@Tom "const char const *"--- 도대체 이것은 무엇입니까? 이것은 불법입니다. – h9uest

0

다음은 두 가지가 모두 필요한 예입니다. bar 때문에

class foo { 
    char* data_; 
public: 
    const char* data() const 
    { 
     return data_; 
    } 

    char* data() 
    { 
     return data_; 
    } 
}; 

const foo bar; 
foo bar2; 
bar->data(); // this uses the const version. 
bar2->data(); // this uses the non-const version. 

data() const가 아닌 버전을 호출하는 것은 오류 일 것 const 개체입니다.

+0

감사합니다. Andre, 다양한 사용 사례를 명확하게 설명합니다. – DeltaLima