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もなかなか見かけませんね。
普段使っているものでも意外と知らないものが多かったりします。
気になった方は是非調べてみてください。
| 固定リンク | コメント (0) | トラックバック (0)
「プログラマー」カテゴリの記事
- 技術交流の業(2019.03.07)
- 福袋争奪戦デビュー(2019.01.31)
- 温泉旅行(2019.01.24)
- ゲーセンの近況(2018.11.29)
- 健康的にプログラミングを続けるためのちょっとした習慣(2018.10.18)
この記事へのコメントは終了しました。
コメント