僕は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)で呼べる、ということな訳で。