2011-03-10 6 views
5

C++의 메소드에 대한 현재의 이해와 충돌하는 상황이 발생했습니다.C++의 메서드 반환 형식 및 수정 자 순서가 중요합니까?

저는 Ivor Horton의 "Beginning Visual C++ 2010"(Wrox Press)을 통해 작업하고 있습니다. 내가 같이 수정 재 배열했다

double Volume() const { 
    return m_Length * m_Width * m_Height; 
} 

: 같은 페이지 449에서 예 8_03, 메소드가 정의 내 C# 및 Java 배경에서

double **const** Volume() { 
    return m_Length * m_Width * m_Height; 
} 

을, 나는 할 CONST의 위치를 ​​예상했다 내가 Ivor 그것을 가지고 방식으로 순서를 반환 할 때

error C2662: 'CBox::Volume' : cannot convert 'this' pointer from 
      'const CBox' to 'CBox &' 

오류가 사라 : 무관하지만 컴파일에 나는 오류가 발생했습니다.

실제로 순서가 달라지며 일부 이국적인 버그가 아닌가요? 순서가 중요하다면 올바른 위치를 어떻게 기억합니까?

감사합니다,

스콧 const이 멤버 메소드의 이름 뒤에 위치

답변

9

은, 그것은 this 포인터가 일정 것입니다 것을 주장한다. 즉, 원래 선언에 의하면 CBox::Volume() 메서드는 호출 된 CBox 개체를 변경하지 않는다고 설명합니다.

가장 큰 오류의 원인은 const CBox에서 CBox::Volume() 함수가 호출되었거나 다른 const 메서드에서 CBox 메서드가 호출되고 있다는 것입니다.

+0

아, 그래! 이것은 정확히 그 것이 었습니다 - 컴파일러는 이것과 const에 관해 화가났습니다. 그래서 const가 메소드의 끝 부분에 추가된다는 것은 표준 규칙 일뿐입니다 ... 결국 const는 이것이 const라는 것을 의미합니까? Java/C#의 느슨한 세상은 너무 용서합니다. –

+0

@Scott : Java는 용서할 수 없지만 형식 한정자가 없습니다. 'const'를 사용할 때 복잡한 타입의 어느 부분이'int const * '를 수정하는지 문제가됩니다. const가 다른 것들에 적용되기 때문에'int * const'와 같지 않습니다. 마찬가지로 멤버 함수 선언에서'const'의 위치는 의미가 있습니다. 그리고 "멤버 함수"에 주목하십시오. 여러분이 계속 메소드를 호출한다면, C++을 자바와 다른 모자에서 무의식적으로 생각하게 할 것이며, 그렇지 않습니다 :-) –

2

이 경우 멤버 함수 이름 뒤의 const은 함수 자체가 const임을 의미합니다. 이는 멤버 함수 내에서 개체를 수정할 수 없음을 의미합니다. member 함수 앞에있는 const는 반환 유형이 const임을 의미합니다. (반환 유형에 대해 복잡해질 수 있지만 여기에 들어가기를 원하지는 않습니다.)

1

예 순서가 중요합니다.

C++에서 const 키워드의 위치는 "const"항목에 영향을 미칩니다. const 키워드가 사용되는 범위도 같습니다.

2

편집 됨 더 간결하게하려면.

const이 두 상황에서 매우 다릅니다. 개체의 인스턴스가 const이며 double을 반환 할 때

double Volume() const { 
    return m_Length * m_Width * m_Height; 
} 

가 호출됩니다. 비 const 인스턴스로 해당 메소드를 호출하려고하면 컴파일되지 않습니다. 한편
const myClass obj; 
double d = obj.volume(); 
myClass obj2; 
double d = obj2.volume(); // This Fails to compile 

...

double const Volume() { 
    return m_Length * m_Width * m_Height; 
} 

이 객체가 const이 아니거나 이전 정의가 존재하지 않는 경우 때 호출된다.

myClass obj; 
const double d = obj.volume(); 
const myClass obj2; 
const double d = obj2.volume(); 

(나는 아래 나게되면서 나는 CONST를 반환 언급해야한다 내장 타입은 정말 아무것도 의미하지 않는 등 double한다.)

이 모두 적절한 하나를 선언 당신이 한 때 인스턴스가 const인지 아닌지에 따라 호출됩니다.

myClass obj; 
const double d = obj.volume(); // This calls `const double volume()` 
const myClass obj2; 
double d = obj2.volume(); // This calls 'double volume() const` 
+0

마지막 스 니펫은 아마도 오해의 소지가 있습니다. 반환 값은 비 const'double'에 저장되고 이후에 변경 될 수 있습니다. [내장 타입을'const'로 반환하는 것은 아무 효과가 없습니다.] (http://stackoverflow.com/questions/1443659/should-i-return-bool-or-const-bool) – Troubadour

+0

예 ... 당신은 알고 있습니다. 나는 사실에 대해 생각했다. 내장형으로 절단되거나 건조하지 않습니다. 나는 그것을 반영하여 편집 할 것이다. –

+0

이것은'obj'가 첫 번째를 호출하기 위해 const 여야 만한다는 것과 그 결과는 두 번째 경우에 const double에 할당되어야한다는 잘못된 인상을줍니다. http://ideone.com/6hBWH (두 번째 경우는 실제로 무의미해야합니다 - G ++은 최상위 수준의 const 한정자가 반환 유형에서 무시된다는 경고조차도합니다.) – UncleBens

2

메소드 이름 후의 const는 방법 (mutable 부재는 예외) 데이터 부재를 수정할 것이다 컴파일러 말한다.

메서드 이름이 반환 값에 적용되기 전에 const이 적용됩니다. 이것은 메소드가 상수 데이터를 리턴한다는 것을 컴파일러에 알립니다. 반환 유형에 대한 const은 주로 참조 및 포인터와 함께 사용됩니다.

+0

고마워요 토마스! 이것은 도움이됩니다. –

관련 문제