2014-01-31 5 views
16

나는 여전히 C++에 대해 배우고 있으며 어디에서든 const을 사용할 수있는 모든 곳을 읽고 있습니다 (내가 생각하는 속도의 이유 때문에).getter에서 C++ const

const bool isReady() { 
    return ready; 
} 

하지만이 방법으로 일부 IDE의 자동 생성 게터는 것을 본 적이 :

나는 보통 이런 식으로 내 getter 메소드를 작성하고 있습니다

bool getReady() const { 
    return ready; 
} 

는하지만, 대표를 작성, 그 일이 이 메시지가 나타나면이 오류를 찾으십시오.

member function 'isReady' not viable: 'this' argument has type 'const VideoReader', but function is not marked const 

So const getter를 작성하는 더 좋은 방법은 무엇입니까? 나는 정말로 신경 써야 하나?

+0

부울을 언급 할 때이 질문은 다소 어리석은 것처럼 보였습니다. 그래도이 질문에 const에 대한 훌륭한 설명을 찾았습니다. http://stackoverflow.com/questions/5503352/const-before-or-const-after – hubatish

답변

33

두 가지 방법에는 큰 차이가 있습니다.

const bool isReady() 

의 코드는 위의 const bool를 반환합니다,하지만 객체가 로직 상태를 변경하지 않을 것을 보증하지 않습니다.

bool isReady() const 

이것은 bool를 반환합니다, 그것은 개체의 논리 상태가 변경되지 않습니다 보장합니다. 이 경우 리턴 유형 앞에 const을 쓸 필요는 없습니다. 어쨌든 사본이므로 const bool을 반환하는 것은 의미가 없습니다. 그래서 그것을 const으로 만드는 것은 쓸모가 없습니다. 두 번째 constconst correctness에 필요합니다. 속도 문제로 사용되지는 않지만 프로그램의 안정성과 안전성을 높이기 위해 사용됩니다.

+4

"이 책을 읽어야합니다."링크를 제공 할 수 있습니까? – nkint

+3

@nkint : 예. Scott Meyers의 Effective C++ 또는 Herb Sutter의 Exceptional C++. 다음은 이전의 http://www.gotw.ca/gotw/006.htm이며 C++ 11의 경우 더욱 중요 해졌습니다. http://herbsutter.com/2013/05/24/gotw-6a-const-correctness-part-1-3/ – mkaes

+0

이것이 문제의 설명에서 가장 좋은 대답이라고 생각하지 않지만 링크는 다음과 같습니다. 아주 좋아! – nkint

2

CONST 게터 다른 버전은 const있어서, 단지 (기본적 쓸모)는 const 값을 반환하지 않은 서명을

bool getReady() const 

있다. const 게터를 갖는

당신이 const를 객체에 호출 할 수 있습니다 : getReadyconst로 표시되는 경우

const Object obj; 
obj.getReady(); 

이 만 유효합니다.

const bool isReady() { 
    return ready; 
} 

이 일정한 부울을 반환

19

그들은이 differnt 한 가지를 의미한다. 그것이 생성 된 시간부터 가치를 바꿀 수없는 bool을 의미합니다.

bool getReady() const { 
    return ready; 
} 

이것은 상수 함수로, 속한 클래스의 멤버 변수를 변경하지 않는 함수입니다. 이것은 getter 용으로 권장되는 스타일로, 데이터를 검색하는 것이 목적이므로 프로세스에서 아무 것도 수정하지 않아야합니다.

2

반환 유형 또는 메서드 서명에 const 키워드를 사용하는 것과 다른 점이 있습니다. 첫 번째 경우 반환 값은 상수 값이됩니다. 두 번째 경우에서 메서드는 개체의 표현을 변경할 수없는 소위 상수 메서드가됩니다.상수 오브젝트에서는 상수 메소드 만 호출 할 수 있습니다.

class A { 
public: 
bool getReady() const { 
    return ready; 
} 
}; 

당신이 getReady 내부 개체를 수정하려고하면 그렇게() 다음 컴파일러 오류를 발행합니다 :

5

const 메소드는,이 메소드가 호출되는이 클래스 인스턴스를 수정하지 않습니다 컴파일러를 알려줍니다. Const 메서드는 const : & 또는 const A *가있는 곳에서 유용합니다. 그런 다음 이러한 개체에 const 메서드 만 호출 할 수 있습니다.

에 대한 같은 : 부울이 isReady 상태() 반환하면서 복사되기 때문에

const bool isReady() { 
    return ready; 
} 

이 CONST는, 실제로 실제 혜택을 제공하지 않습니다. 반환 유형이 const char* 또는 const A& 인 경우 이러한 const은 의미가 있습니다.이 경우 const은 char 문자열 또는 A 클래스 인스턴스를 변경 불가능하게 만듭니다.