はじめに
コメントなどありがとうございます。
引き続きやっていきます。
今回行うのは、C++の指定子 explicit についてです。
Effective C++ 第3版 - イントロダクション -
C++の指定子 explicit
explicitとは?
C++で、暗黙の型変換を禁止する機能(指定子)です。
暗黙の型変換とは?
コンパイラが勝手にこうだろと認識して変換し、コンパイルすること。
下にクラスのコンストラクタにexplicit指定子を使った場合と使ってない場合のサンプルコードを示します。
下のサンプルコードでコンパイラが暗黙の型変換をしている箇所は、
ClassB2 test4 = 6;
の部分です。
どのようにコンパイラが認識しているかというと、
ClassB2 test4 = ClassB2(6);
のように認識して、コンパイルしています。
つまり、explictなしで宣言されたコンストラクタは、予想外の型変換を引き起こすので、一般的には、explict付きで宣言されたコンストラクタのほうが良い。
したがって、特に理由がないならexplictを付けるように心がけようかと思います。
ちなみに、explictありで宣言されたコンストラクタのクラスを呼ぶ場合、
ClassB test3 = 5;
のようにクラスを呼び出すと、コンパイルエラーとなります。
サンプルコード
# include <iostream>
class ClassB {
public:
explicit ClassB(int a) { std::cout << __func__ << " 引数 : " << a << std::endl; }; // デフォルトコンストラクタではない
~ClassB(){};
};
class ClassB2 {
public:
ClassB2(int a) { std::cout << __func__ << " 引数 : " << a << std::endl; };
~ClassB2(){};
};
int main(int argc, char *argv[]) {
std::cout << "intro_default_constructor2.cpp" << std::endl;
ClassB test(3);
ClassB2 test2(4);
// ClassB test3 = 5; // コンパイルエラー
ClassB2 test4 = 6;
}
実行結果
参考文献
・https://www.amazon.co.jp/gp/product/4621066099/ref=dbs_a_def_rwt_hsch_vapi_taft_p1_i0