1. ホーム
  2. c++

[解決済み] explicit キーワードの意味は?

2022-03-16 15:37:37

質問

とは何ですか? explicit キーワードはC++でどういう意味ですか?

どのように解決するのですか?

コンパイラは、関数へのパラメータを解決するために、1つの暗黙の変換を行うことが許されています。これはどういうことかというと、コンパイラは関数へのパラメータを解決するために、暗黙のうちに1つの変換を行うことが許されています。 シングルパラメータ を使用して、ある型から別の型に変換し、パラメータとして正しい型を取得します。

暗黙の変換に使用できるコンストラクタを持つクラスの例を示します。

class Foo
{
private:
  int m_foo;

public:
  // single parameter constructor, can be used as an implicit conversion
  Foo (int foo) : m_foo (foo) {}

  int GetFoo () { return m_foo; }
};

以下は Foo オブジェクトを作成します。

void DoBar (Foo foo)
{
  int i = foo.GetFoo ();
}

で、ここで DoBar 関数が呼び出されます。

int main ()
{
  DoBar (42);
}

引数は Foo オブジェクトではなく int . しかし Fooint というわけで、このコンストラクタを使ってパラメータを正しい型に変換することができます。

コンパイラは、各パラメータに対して一度だけこの処理を行うことが許されています。

をプレフィックスとする explicit キーワードをコンストラクタに追加すると、コンパイラがそのコンストラクタを暗黙の変換に使用できなくなります。上記のクラスにこのキーワードを追加すると、関数呼び出しの際にコンパイラ・エラーが発生します。 DoBar (42) . のように、明示的に変換を呼び出す必要があります。 DoBar (Foo (42))

このようにしたい理由は、バグを隠してしまうような偶発的な構築を避けるためです。
工夫された例

  • あなたが持っているのは MyString クラスは、指定されたサイズの文字列を構築するコンストラクタを備えています。 また、関数 print(const MyString&) (また、オーバーロード print (char *string) を呼び出すと print(3) (あなたが 実際に を呼び出すつもりだった。 print("3") ). 3"と表示されるかと思いきや、長さ3の空の文字列が表示されます。