2011-10-07 6 views
0

다음은 정적 멤버 함수 인 내부 (헤더 파일 내부에 정의 됨)입니다. 리터럴 문자열 "MyClass"는 항상 정적 메모리에 보장됩니까? 그렇지 않다면 스택에 포인터를 반환하지 않겠습니까?다음과 같이 정의되지 않은 동작이 있습니까?

const char * className() 
{ 
return "MyClass"; 
} 

편집 :이 약

어떻게?

const RWCString& className() 
{ 
return "MyClass"; 
} 

RWCStringconst char* 취하는 암시 생성자를 갖는 스트링 클래스이다. http://www.roguewave.com/portals/0/products/sourcepro/docs/11/html/toolsref/rwcstring.html

+0

'RWCString'에 대해서 들어 본 적도 없다 ... XD하지만 생성자가 처리해야하므로 괜찮다고 가정합니다. – Mysticial

+0

@Mysticial하지만이 함수는 암시 적 costructor를 사용하여 각 호출마다 새로운 RWCString을 만듭니다. className()을 호출 할 때마다 새로운 참조 – onof

+0

이 반환됩니다. 내 의견은 당신이 그처럼 참고로 돌아갈 수 없기 때문에 잘못되었습니다. – Mysticial

답변

5

첫 번째 예제 : (더 나은 당신은 그것을 const 선언). "MyClass"은 코드가 호출되기 전에 수명이 시작되고 코드가 완료된 후에 끝나는 유형 char const[8] 리터럴이므로 아무런 문제가 없습니다.

그러나 두 번째 예는 작동하지 않습니다.

const RWCString& className() 
{ 
    return "MyClass"; 
} 

그것은 필요하며 RWCString 유형의 객체에 대한 참조를 반환 할 수 있도록하는 기능 내에 구성된다. 그러나 함수 내에서 로컬 변수 또는 임시로 빌드 된 것은 참조로 반환 될 수 없으므로 컴파일되지 않은 비헤이비어를 얻습니다.

당신은 매우 간단하지만 "좋은"기능으로 바꿀 수 있습니다

다음
const RWCString& className() 
{ 
    static RWCString const N = "MyClass"; 
    return N; 
} 

나는 함수가 호출 될 때 처음 건설 될 지역 정적 객체 N를 만듭니다. static이기 때문에 수명이 지나치게 길어 지므로 참조를 반환하는 것이 좋습니다.

편집 : 스티브가 지적했듯이 임시 변수가 여기에 해당하는 것이 더 적절합니다.

+0

빠른 질문 : 함수 내부에서 값을 만들 수없는 경우 참조 ('const RWCString &')로 반환하는 목적은 무엇입니까? (범위를 벗어날 것이므로) – Mysticial

+0

@ 신비로운 : 일반적으로? 값은 인수 중 하나에서 얻을 수 있습니다. 예를 들면 :'std :: string const & find (std :: map const &);', 결과는 맵에있는 값 중 하나입니다. 지도가 발신자에 의해 제공되므로 참조 (이 발신자에게)하여 안전하게 반환 할 수 있습니다. 그러나 호출 체인까지 멀리 참조를 전달하고 이해가되지 않는 지점에 도달하는 것은 쉽습니다. 따라서 참조 및 포인터를 처리하기가 어렵습니다. –

+0

아, 그 말이 맞습니다. 응답 해 주셔서 감사합니다. – Mysticial

5

아니요. 이것은 완전히 정의되었습니다. 문자열이 스택에 없습니다. 그것은 세계적인 기억 속에 있습니다. 따라서 반환하는 포인터는 유효합니다.

const char * className() 
{ 
    return "MyClass"; 
} 

괜찮 :