« 食欲の秋 | トップページ | 素直を知ること »

2014年10月21日 (火)explicitって知ってますか?

皆さん、こんにちは。本日当番のプログラマーのR.Hです。

さて、今回は少しマニアックなお話をしようと思います。
いきなりですが以下のコードを見てください。
class Hoge
{
public:
  Hoge( int value )
    : m_Value( value )
  {
  }

  int m_Value;
};

void main( void )
{
  Hoge hoge( 100 );
}

コンストラクタでint型の値を引数とするなんの変哲もないクラスです。
ここで以下のように、Hoge型の変数を受け取る関数があったとします。
void Foo( const Hoge& hoge )
{
  /* 何かの処理 */
}

void main( void )
{
  Hoge hoge( 100 );
  Foo( hoge );
}

関数FooはHoge型の変数を引数として受け取るのですが、実は以下のようにint型の値を直接渡してもコンパイルできてしまいます。
何故かというと暗黙的にHoge型のコンストラクタが呼ばれているからなんです。
void main( void )
{
  /* Hoge型の変数を渡している */
  Hoge hoge( 100 );
  Foo( hoge );

  /* Hoge型の変数じゃないけどOK! */
  Foo( 100 );

  /* ↑は内部的には以下のような変換が行われている */
  Foo( Hoge( 100 ) );
}

普段は特に気にはすることは無いと思います、というかむしろ便利です。
しかし、逆にこういった機能が欲しくないときもあります。
そういうときは、コンストラクタの宣言の頭にexplicitをつけます。
こうすることによって関数FooはHoge型の変数を渡さないとエラーになります。
class Hoge
{
public:
  explicit Hoge( int value )
    : m_Value( value )
  {
  }

  int m_Value;
};

void Foo( const Hoge& hoge )
{
  /* 何かの処理 */
}

void mian( void )
{
  /* Hoge型の変数を渡しているので問題なし! */
  Hoge hoge( 100 );
  Foo( hoge );

  /* Hoge型の変数じゃないのでエラー! */
  Foo( 100 );
}


explicitなんてめったに使わないし、見たことない人もいるかと思います。
explicit以外ですと、volatileやmutableもなかなか見かけませんね。
普段使っているものでも意外と知らないものが多かったりします。
気になった方は是非調べてみてください。

follow us in feedly
result = encodeURIComponent( "http://www.accessgames-blog.com/blog/2014/10/explicit-64dd.html" );document.write( "result = " , result );&media=https%3A%2F%2Ffarm8.staticflickr.com%2F7027%2F6851755809_df5b2051c9_z.jpg&description=Next%20stop%3A%20Pinterest">

| | コメント (0) | トラックバック (0)

« 食欲の秋 | トップページ | 素直を知ること »

プログラマー」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: explicitって知ってますか?:

« 食欲の秋 | トップページ | 素直を知ること »