2010-04-22 4 views

답변

6

내재적으로 존재하는 operator==(char*, char*)은 (는) ==의 사용과 더 잘 일치합니다. 코드 "cobble" == "stone"

오퍼레이터 ==는 다른 방식으로 매칭 될 수 operator==(char[], const String&)operator==(const String&, String), 등등 operator==(const String&, const std::string&)는 인수의 타입 파라미터 유형 (char*)에서 변환 (String* 등)이 존재 함을 제공 하였다. 그러나 일반적으로 char* 비교는 가장 좋은 입력과 일치합니다.

+0

은 컴파일러에서 연산자 == (char *, char *)를 제공합니까? "cobol"= str 인 경우 어떤 함수가 호출됩니까? str은 자기 문자열 클래스의 객체입니까? operator == (char *, string & str) 또는 연산자 == (string & str1, string & str2) – surender

+0

@Vlad : 변환 문자열 리터럴에서'char *'까지는 더 이상 사용되지 않아야한다. 대신'const char *'를 사용해야합니다. – sbi

+0

== (char *, char *) 연산자는 항상 컴파일러에서 암시 적으로 제공됩니다. 이렇게하면 포인터를 비교할 수 있습니다 :-) 그냥 문자열이 아닌 포인터 값을 비교합니다. – Vlad

5

이들은 C와 같이 간단한 문자 시퀀스이기 때문에 string 클래스의 인스턴스가 없기 때문입니다.

13

C++에서 문자열 리터럴은 String (그게 무엇이든)이 아니라 (0으로 끝나는 문자열 상수라고도 함) 유형이며 std::string이 아니기 때문에
operator==은 주소를 비교하여 char* 두 개를 비교합니다. 배열은 첫 번째 요소에 대한 포인터로 암시 적으로 변환 될 수 있기 때문에 (이 C 유산을 올바르게 추측했기 때문에)이 연산자가 단계적으로 수행하고 비교하는 것은 메모리에있는 이러한 리터럴의 주소입니다.

String 클래스에 const char* (String::String(const char*))의 암시 적 변환 생성자가 있다고 가정하면이 중 하나를 String으로 변환 할 수 있습니다. 다른 문자열은 암시 적으로 변환 될 것입니다 : (.. Stringconst char*을 복용 operator==의 과부하가 효율성을 제공하지 않는 한 그들이 제공하는 경우, 그들은에서 단계)

String("cobble") == "stone" 

+0

"우리는 이것을 C에서 상속 받았습니다"- 우리는 C에서 그들은 const가 아닌 char []이었습니다. 수정은 정의되지 않았거나 위험한 것이었지만 histori 때문에 구문 적으로 허용되었습니다 칼 이유. –

+0

@Windows 프로그래머 : K & R C. C는 C++의 'const' 키워드를 채택했습니다. 현재 C++ 표준은 C89를 참조하고 C89 문자열 리터럴의 AFAIK는'const char []'유형입니다. (하지만 제 C는 꽤 녹슬 었습니다. 제 잘못이라면 제발 정정하십시오.) 어쨌든, 제 주요 요점은 문자열 리터럴이'std :: string' 유형이 아니라 영숫자 문자 버퍼입니다. 그리고 우리는 물려 받았습니다. – sbi

+1

"틀렸 으면 제발 제발, 제발." - 당신은 이미 정정되었고 여기 반복됩니다. 6.4.5 C 표준에서 "배열 요소는 const를 말하지 않고"char 타입을가집니다. –

1

"cobble"이 경악으로 해석 a char*이고 컴파일러는 포인터 비교를 사용하여 char*을 비교합니다. 당신이 문자열의 내용을 비교하려면, 대신

std::string("cobble") == std::string("stone") 

사용하고, 컴파일러는 operator== (const std::string &, const std::string &)을 사용합니다.

+0

또 다른 대답은 문자열 리터럴은 char []입니다. 그것은 char *인가 char []인가? 그게 그렇게 중요한 건가? – AshleysBrain

+0

그것은 char *입니다. 그러나 내가 아는 한 그것은 중요하지 않습니다. – Danvil

+1

@ Danvil Nope. @Ashleys : 문자열 리터럴은 일부 'N'에 대해'const char [N]'유형을가집니다. 아시다시피 배열은 포인터로 쇠퇴 할 수 있으며,이 경우에는'const char *'로 감쇠 될 수 있습니다.또한'const char *'에서'char *'로의 deprecated * 변환이 있는데, 수정하면 정의되지 않은 행동으로 이어진다. 문자열 리터럴은 확실히'char * '가 아닙니다. – GManNickG

관련 문제