ホームページ  >  記事  >  バックエンド開発  >  C++ の暗黙的な型変換とは何ですか?

C++ の暗黙的な型変換とは何ですか?

青灯夜游
青灯夜游オリジナル
2020-07-24 10:59:343603ブラウズ

C における暗黙的な型変換とは、コンパイラによる「コンストラクター パラメーターの型」から「クラス型」への自動変換を指します。暗黙的なクラス型変換にはリスクが伴います。暗黙的な変換の結果、クラスの一時変数が生成され、操作が完了すると消滅します。テスト完了後に破棄されるオブジェクトを構築しました。

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++ の暗黙的な型変換とは何ですか?

これで、ユーザーは表示タイプの変換を実行し、一時オブジェクトを明示的に作成することのみが可能になります。

要約すると:

  • は 1 つの実パラメータで呼び出すことができますが、これはコンストラクタが 1 つの仮パラメータしか持てないという意味ではありません。

  • 暗黙的なクラス型変換はエラーを引き起こしやすいため、暗黙的なクラス型変換を使用する明確な理由がない限り、1 つの引数で呼び出せるすべてのコンストラクターを明示的に宣言してください。 。

  • explicit は、クラス内のコンストラクターの宣言にのみ使用できます。暗黙的な型変換によって引き起こされる問題は回避できますが、ユーザーは一時オブジェクトを明示的に作成する必要があります (ユーザーに要件が課せられます)。

推奨: 「

C チュートリアル

以上がC++ の暗黙的な型変換とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。