2010-07-05 5 views
2

저는 보통 코드에 std :: string을 사용 합니다만, 단순한 비교를 위해 매개 변수에 문자열을 전달할 때 리터럴을 사용하는 것이 더 낫습니다. ? 여전히 사용하는 것이 더 좋을 것이다, 속성이이 벡터는과의 비교를하고 있다는 사실에도 불구하고std :: string 대 함수의 문자열 리터럴

bool Message::hasTag(string tag) 
{ 
    for(Uint tagIndex = 0; tagIndex < m_tags.size();tagIndex++) 
    { 
     if(m_tags[tagIndex] == tag) 
      return 0; 
    } 

    return 1; 
} 

, 그리고 어떤이 기능은 아마에 문자열을 전달합니다 사용

이 기능을 고려 어쨌든 문자열 리터럴처럼 사용될 새로운 문자열을 만드는 것을 피하기 위해 const char *?

+6

클래스/구조체 유형의 매개 변수는 특별한 이유가없는 한 항상 참조 (아마도 const 참조)에 의해 전달되어야합니다. –

+1

"네임 스페이스 표준을 사용하면 안됩니다." 귀하의 코드입니다. 문제가 생길 겁니다, 약속드립니다. – amro

+3

@amro using namespace std; 헤더 파일이 아닌 소스 파일에서 완벽하게 정상입니다. –

답변

16

당신이 클래스를 사용하려면, 여기에 가장 좋은 방법은 const를 참조입니다 :

bool Message::hasTag(const string& tag); 

그런 식으로, redudant 복사를 최소화 할 수 있으며이 방법은 인수를 수정하려고하지 않는다는 것을 분명히 있어요 . I 영리한 컴파일러는 문자열 리터럴로 호출 할 때 매우 좋은 코드를 생성 할 수 있다고 생각합니다.

==을 사용하여 포인터를 직접 비교하기 시작하면 문자 포인터를 전달하면 strcmp()을 사용해야합니다. 문제가 될 수 있습니다.

+2

컴파일러가 얼마나 영리한 지간에 문자열 객체를 생성해야합니다. –

+0

Neil 문자열 객체를 구성해야한다는 것은 무엇을 의미합니까? 컴파일러가 "&"를 "*"와 "교환"하지 않고 역 참조 구문을 올바르게 해석하지 않습니까? – ctinnist

+0

@ctinnist : 참조 (또는 포인터)를'string' 객체에 전달하는 경우, 어떤 시점에서 여전히'string' 객체가 있어야합니다. –

1

string 값보다는 참조를 전달하는 것으로 충분하다고 생각합니다. 내 말은 :

bool Message::hasTag(const string& tag) 

원래 string 값에 대한 참조 만 복사합니다. 어쨌든 somwhere하지만 함수 밖에서 만들어야합니다. 이 함수는 매개 변수를 복사하지 않습니다.

어쨌든 m_tags은 문자열의 벡터이므로 const string& 매개 변수는 더 좋은 아이디어입니다.

2

짧은 대답은 다릅니다.

긴 답 : std::string은 문자열 (하위 문자열 검색, 하위 문자열 추출, 문자열 연결 등)에 많은 유틸리티 기능을 제공하므로 매우 유용합니다. 또한 메모리를 관리하므로 문자열의 소유권을 혼동 할 수 없습니다.

귀하의 경우에는 필요하지 않습니다. m_tags에있는 객체가 주어진 문자열과 일치하는지 여부 만 알면됩니다. 따라서 귀하의 경우에는 const char *s을 사용하여 함수를 작성하는 것만으로도 충분합니다.

그러나, 풋 노트로 : 약 수익을 이야기 할 때 당신은 거의 항상(const) char * 이상 std::string을 선호합니다. 왜냐하면 C 문자열에는 소유권 의미가 전혀 없기 때문에 const char *을 반환하는 함수는 누가 가리키는 메모리 (호출자 또는 호출 수신자)를 소유했는지 설명하고 호출 수신자가 가져온 경우이를 해제하는 방법을 설명 할 때 매우 신중하게 문서화해야합니다 delete[], delete, free, 다른 것).