C における暗黙的な型変換とは、コンパイラによる「コンストラクター パラメーターの型」から「クラス型」への自動変換を指します。暗黙的なクラス型変換にはリスクが伴います。暗黙的な変換の結果、クラスの一時変数が生成され、操作が完了すると消滅します。テスト完了後に破棄されるオブジェクトを構築しました。
#C の暗黙的なクラス型変換
「C 入門」で言及:
#「単一パラメータで呼び出すことができるコンストラクタは、パラメータ型からクラス型への暗黙的な変換を定義します。」これは次のようになります。ここで、「単一の仮パラメータで呼び出すことができる」とは、コンストラクタが 1 つの仮パラメータのみを持つことができるという意味ではなく、複数の仮パラメータを持つことができるが、それらの仮パラメータにはデフォルトの実パラメータがあることを意味することに注意してください。 それでは、「暗黙的な変換」とは何でしょうか?上の文にもあるように、
はコンパイラーによるコンストラクターのパラメーター型からクラス型への自動変換です。
コードを見てみましょう:#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 クラス型パラメーターを予期していますが、文字列型 Give を渡しています。それは、これはそれが望んでいることではありません!幸いなことに、BOOK クラスには文字列型の実パラメータで呼び出されるコンストラクタがあり、コンパイラはこのコンストラクタを呼び出し、文字列型を暗黙的に BOOK 型に変換し (BOOK 一時オブジェクトを構築し)、それを渡します。 isSameISBN 関数。 暗黙的なクラス型変換には依然としてリスクが伴います。上でマークしたように、暗黙的な変換はクラスの一時変数を取得し、操作の完了後に消えます。テストの完了後に破棄されるオブジェクトを構築します。 明示的な宣言によってこの変換を抑制できます:
explicit BOOK(string ISBN,float price=0.0f):_bookISBN(ISBN),_price(price){}明示的なキーワードは、クラス内のコンストラクター宣言にのみ使用できます。この方法では、BOOK クラスのコンストラクターはオブジェクトであるため、使用できません。が暗黙的に作成される場合、上記のコードをコンパイルすると、次のプロンプトが表示されます。 これで、ユーザーは表示タイプの変換を実行し、一時オブジェクトを明示的に作成することのみが可能になります。
要約すると:
C チュートリアル 」
以上がC++ の暗黙的な型変換とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。