Top > C++ > コンストラクタにexplicitをお忘れなく

explicitがどういう効果を持つのか,単純に知りませんでした。
ですので,その紹介。

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 
-
|
!
 
 
-
|
!
 
 
-
|
!
 
class A
{
  A( int );
}
 
class B
{
  B( const A& );
}
 
void func()
{
  B( 3 );
}

BのコンストラクタはAが引数の型なんだから
3を入れてら怒られるじゃない!

なんですが,実はこれ怒られないんです。

暗黙の変換(だったっけ?)というものが行われ,内部では

すべてを展開すべてを収束
  1
  2
  3
  4
  5
 
-
|
!
 
void func()
{
  B( A(3) );
}

が行われるんだそうです。
それを防ぐために,explicitキーワード。

すべてを展開すべてを収束
  1
  2
  3
  4
  5
 
-
|
!
 
class B
{
  explicit B( const A& );
}

こうすれば,勝手に変換されなくなるんだそうです。


リロード   新規 下位ページ作成 編集 凍結 差分 添付 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Sat, 08 Jul 2006 18:33:32 JST (4034d)