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

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

Everything is expanded.Everything is shortened.
  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を入れてら怒られるじゃない!

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

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

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
 
-
|
!
 
void func()
{
  B( A(3) );
}

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

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
 
-
|
!
 
class B
{
  explicit B( const A& );
}

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


Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup Referer   Help   RSS of recent changes
Last-modified: (5886d)