> 백엔드 개발 > C++ > 오버로드된 C 인쇄 방법에서 \'Hello World\'가 \'True\'로 인쇄되는 이유는 무엇입니까?

오버로드된 C 인쇄 방법에서 \'Hello World\'가 \'True\'로 인쇄되는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-11-14 11:05:02
원래의
256명이 탐색했습니다.

Why Does

오버로드된 메서드의 문자열 리터럴 모호성

C에서 여러 유형을 허용하는 메서드를 오버로드하는 경우 잠재적인 모호성을 인식하는 것이 중요합니다. 아래 그림과 같습니다.

<code class="cpp">class Output
{
public:
    static void Print(bool value)
    {
        std::cout << (value ? "True" : "False");
    }

    static void Print(std::string value)
    {
        std::cout << value;
    }
};</code>
로그인 후 복사

다음과 같이 문자열 리터럴을 사용하여 Print 메서드를 호출하려고 하면:

<code class="cpp">Output::Print("Hello World");</code>
로그인 후 복사

예기치 않게 출력은 "Hello World" 대신 "True"입니다. ". 왜?

문자열 리터럴과 사용자 정의 변환

C에서 "Hello World"와 같은 문자열 리터럴은 std::string 유형이 아니라 상수 문자의 배열입니다. 그러나 암시적으로 bool 값으로 변환될 수 있습니다. 표준 변환 시퀀스라고 알려진 이 변환은 std::string에 대한 사용자 정의 변환 생성자보다 컴파일러에서 선호됩니다.

오버로드 해결 및 표준 변환

오버로드 해결 중에 컴파일러는 각 인수에 대해 호출할 최상의 함수를 결정합니다. 사용자 정의 변환보다 표준 변환 순서가 선호됩니다. 우리의 경우 "Hello World"에서 bool로의 표준 변환은 std::string으로의 사용자 정의 변환보다 더 나은 것으로 간주됩니다.

모호함을 피하는 방법

std가 ::string 오버로드가 사용되면 std::string 인수를 명시적으로 전달해야 합니다.

<code class="cpp">Output::Print(std::string("Hello World"));</code>
로그인 후 복사

이렇게 하면 모호성이 해결되고 "Hello World"가 올바르게 출력됩니다.

결론

C에서는 암시적 변환과 오버로드 해결에 미치는 영향을 이해하는 것이 중요합니다. 기본적으로 표준 변환은 사용자 정의 변환보다 우선합니다. 따라서 이러한 변환을 인식하고 예기치 않은 동작을 방지하려면 필요한 경우 명시적인 유형 변환을 수행하는 것이 중요합니다.

위 내용은 오버로드된 C 인쇄 방법에서 \'Hello World\'가 \'True\'로 인쇄되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿