僕はC++を書いたころexplicitを使ったことがないへたれだった

 そういえば、EffectiveC++を読んだときに衝撃だったのは、
 explicitだった。
 要するに暗黙の型変換を禁ずる、という素晴らしい機能なのですが使ったことがなかったのです!*1

#define ENABLE_EXPLICIT (FALSE)

class CHoge {
public:
#if ENABLE_EXPLICIT
	explicit CHoge(int index) {
#else
	CHoge(int index) {
#endif
		printf("constructor[%d]?n", index );
		index_ = index;	
	}
	~CHoge(){
		printf("destructor?n");	
	}
	int getValue(){
		return index_;	
	}
private:
	int index_;
};

int main(int argc, char *argv[])
{
	CHoge hoge(100);
	printf("[%d]?n",hoge.getValue());
#if ENABLE_EXPLICIT
	hoge = CHoge(200);
#else
	hoge = 200;
#endif
	printf("[%d]?n",hoge.getValue());

constructor[100]
[100]
constructor[200]
destructor
[200]
destructor

ってな感じなんですけど、hoge = 200って書けちゃうのは恐ろしいですね。
コンストラクタにexplicitをつけることで明示的にhoge = CHoge(200);としなければならなくなります。
これは要するに、
void foo(CHoge hoge)
という関数があったら、foo(300)で呼べる、ということな訳で。

ややこしいよC++*2

*1:威張って言うことではない

*2:嫌いではないケド