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 클래스 생성자는 암시적으로 객체를 생성하는 데 사용할 수 없습니다. 다음 메시지를 보내세요.
이제 사용자는 표시 유형 변환만 수행하고 임시 개체를 명시적으로 생성할 수 있습니다.
요약하자면:
은 하나의 실제 매개변수로 호출할 수 있습니다. 이는 생성자가 하나의 형식 매개변수만 가질 수 있다는 의미는 아닙니다.
암시적 클래스 유형 변환을 사용해야 하는 명확한 이유가 없는 한, 하나의 실제 매개변수로 호출할 수 있는 모든 생성자를 명시적으로 선언하면 쉽게 오류가 발생할 수 있습니다.
explicit은 클래스 내부의 생성자 선언에만 사용할 수 있습니다. 암시적 유형 변환으로 인해 발생하는 문제를 피할 수는 있지만 사용자가 명시적으로 임시 개체를 생성해야 합니다(이는 사용자에게 요구 사항을 부과합니다).
추천: "C++ 튜토리얼"
위 내용은 C++ 암시적 유형 변환이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

C++是一种广泛使用的面向对象的计算机编程语言,它支持您与之交互的大多数应用程序和网站。你需要编译器和集成开发环境来开发C++应用程序,既然你在这里,我猜你正在寻找一个。我们将在本文中介绍一些适用于Windows11的C++编译器的主要推荐。许多审查的编译器将主要用于C++,但也有许多通用编译器您可能想尝试。MinGW可以在Windows11上运行吗?在本文中,我们没有将MinGW作为独立编译器进行讨论,但如果讨论了某些IDE中的功能,并且是DevC++编译器的首选

在C++程序开发中,当我们声明了一个变量但是没有对其进行初始化,就会出现“变量未初始化”的报错。这种报错经常会让人感到很困惑和无从下手,因为这种错误并不像其他常见的语法错误那样具体,也不会给出特定的代码行数或者错误类型。因此,下面我们将详细介绍变量未初始化的问题,以及如何解决这个报错。一、什么是变量未初始化错误?变量未初始化是指在程序中声明了一个变量但是没有

C++是一门广受欢迎的编程语言,但是在使用过程中,经常会出现“未定义的引用”这个编译错误,给程序的开发带来了诸多麻烦。本篇文章将从出错原因和解决方法两个方面,探讨“未定义的引用”错误的解决方法。一、出错原因C++编译器在编译一个源文件时,会将它分为两个阶段:编译阶段和链接阶段。编译阶段将源文件中的源码转换为汇编代码,而链接阶段将不同的源文件合并为一个可执行文

如何优化C++开发中的文件读写性能在C++开发过程中,文件的读写操作是常见的任务之一。然而,由于文件读写是磁盘IO操作,相对于内存IO操作来说会更为耗时。为了提高程序的性能,我们需要优化文件读写操作。本文将介绍一些常见的优化技巧和建议,帮助开发者在C++文件读写过程中提高性能。使用合适的文件读写方式在C++中,文件读写可以通过多种方式实现,如C风格的文件IO

C++是一门强大的编程语言,它支持使用类模板来实现代码的复用,提高开发效率。但是在使用类模板时,可能会遭遇编译错误,其中一个比较常见的错误是“无法为类模板找到实例化”(error:cannotfindinstantiationofclasstemplate)。本文将介绍这个问题的原因以及如何解决。问题描述在使用类模板时,有时会遇到以下错误信息:e

iostream头文件包含了操作输入输出流的方法,比如读取一个文件,以流的方式读取;其作用是:让初学者有一个方便的命令行输入输出试验环境。iostream的设计初衷是提供一个可扩展的类型安全的IO机制。

C++是一种流行的编程语言,它强大而灵活,适用于各种应用程序开发。在使用C++开发应用程序时,经常需要处理各种信号。本文将介绍C++中的信号处理技巧,以帮助开发人员更好地掌握这一方面。一、信号处理的基本概念信号是一种软件中断,用于通知应用程序内部或外部事件。当特定事件发生时,操作系统会向应用程序发送信号,应用程序可以选择忽略或响应此信号。在C++中,信号可以

c++初始化数组的方法:1、先定义数组再给数组赋值,语法“数据类型 数组名[length];数组名[下标]=值;”;2、定义数组时初始化数组,语法“数据类型 数组名[length]=[值列表]”。


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

뜨거운 주제



