>백엔드 개발 >C#.Net 튜토리얼 >C++ 암시적 유형 변환이란 무엇입니까?

C++ 암시적 유형 변환이란 무엇입니까?

青灯夜游
青灯夜游원래의
2020-07-24 10:59:343640검색

C++의 암시적 유형 변환은 "생성자 매개변수 유형"에서 "클래스 유형"으로의 컴파일러의 자동 변환을 의미합니다. 암시적 클래스 유형 변환은 위험을 초래합니다. 암시적 변환으로 인해 클래스의 임시 변수가 생성되고, 이는 작업이 완료된 후 사라지게 됩니다.

C++ 암시적 유형 변환이란 무엇입니까?

C++ 암시적 클래스 유형 변환

"C++ 입문서" 언급:

"단일 형식 매개변수로 호출할 수 있는 생성자는 형식 매개변수 유형에서 형식 매개변수 유형으로의 변환을 정의합니다. 클래스 유형의 암시적 변환입니다. "

여기서 "단일 형식 매개변수로 호출할 수 있다"는 것은 생성자가 형식 매개변수를 하나만 가질 수 있다는 의미가 아니라 여러 형식 매개변수를 가질 수 있다는 의미입니다. 이러한 형식 매개변수에는 모두 기본 실제 매개변수가 있습니다.

그럼 "암시적 변환"이란 무엇인가요? 위 문장에서도 알 수 있듯이 는 컴파일러가 생성자 매개변수 유형을 클래스 유형으로 자동 변환하는 것입니다.

코드를 살펴보겠습니다.

#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std ;
class BOOK  //定义了一个书类
{
    private:
        string _bookISBN ;  //书的ISBN号
        float _price ;    //书的价格

    public:
        //定义了一个成员函数,这个函数即是那个“期待一个实参为类类型的函数”
        //这个函数用于比较两本书的ISBN号是否相同
        bool isSameISBN(const BOOK & other ){
            return other._bookISBN==_bookISBN;
                }

        //类的构造函数,即那个“能够用一个参数进行调用的构造函数”(虽然它有两个形参,但其中一个有默认实参,只用一个参数也能进行调用)
        BOOK(string ISBN,float price=0.0f):_bookISBN(ISBN),_price(price){}
};

int main()
{
    BOOK A("A-A-A");
    BOOK B("B-B-B");

    cout<<A.isSameISBN(B)<<endl;   //正经地进行比较,无需发生转换

    cout<<A.isSameISBN(string("A-A-A"))<<endl; //此处即发生一个隐式转换:string类型-->BOOK类型,借助BOOK的构造函数进行转换,以满足isSameISBN函数的参数期待。
    cout<<A.isSameISBN(BOOK("A-A-A"))<<endl;    //显式创建临时对象,也即是编译器干的事情。
    
    system("pause");
}

코드에서 볼 수 있듯이 isSameISBN 함수는 BOOK 유형 매개변수를 기대하지만 원하는 것이 아닌 문자열 유형을 전달했습니다. 아! 다행스럽게도 BOOK 클래스에는 문자열 유형의 실제 매개변수로 호출되는 생성자가 있습니다. 컴파일러는 이 생성자를 호출하고 암시적으로 문자열 유형을 BOOK 유형으로 변환(BOOK 임시 객체 생성)한 후 이를 전달합니다. isSameISBN 함수입니다.

암시적 클래스 유형 변환은 여전히 ​​위험을 초래합니다. 위에 표시된 것처럼 암시적 변환은 작업 완료 후 사라지는 클래스의 임시 변수를 얻습니다. 테스트 완료 후 삭제되었습니다.

명시적 선언을 통해 이 변환을 억제할 수 있습니다.

explicit BOOK(string ISBN,float price=0.0f):_bookISBN(ISBN),_price(price){}

explicit 키워드는 클래스 내부의 생성자 선언에만 사용할 수 있습니다. 이러한 방식으로 BOOK 클래스 생성자는 암시적으로 객체를 생성하는 데 사용할 수 없습니다. 다음 메시지를 보내세요.

C++ 암시적 유형 변환이란 무엇입니까?

이제 사용자는 표시 유형 변환만 수행하고 임시 개체를 명시적으로 생성할 수 있습니다.

요약하자면:

  • 은 하나의 실제 매개변수로 호출할 수 있습니다. 이는 생성자가 하나의 형식 매개변수만 가질 수 있다는 의미는 아닙니다.

  • 암시적 클래스 유형 변환을 사용해야 하는 명확한 이유가 없는 한, 하나의 실제 매개변수로 호출할 수 있는 모든 생성자를 명시적으로 선언하면 쉽게 오류가 발생할 수 있습니다.

  • explicit은 클래스 내부의 생성자 선언에만 사용할 수 있습니다. 암시적 유형 변환으로 인해 발생하는 문제를 피할 수는 있지만 사용자가 명시적으로 임시 개체를 생성해야 합니다(이는 사용자에게 요구 사항을 부과합니다).

추천: "C++ 튜토리얼"

위 내용은 C++ 암시적 유형 변환이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.