1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

勉強記録 2日目 - Effective C++ 第3版 -

Last updated at Posted at 2019-11-25

 はじめに

コメントなどありがとうございます。
引き続きやっていきます。
今回行うのは、C++の指定子 explicit についてです。

Effective C++ 第3版 - イントロダクション -

C++の指定子 explicit

explicitとは?
C++で、暗黙の型変換を禁止する機能(指定子)です。

暗黙の型変換とは?
コンパイラが勝手にこうだろと認識して変換し、コンパイルすること。

下にクラスのコンストラクタにexplicit指定子を使った場合と使ってない場合のサンプルコードを示します。

下のサンプルコードでコンパイラが暗黙の型変換をしている箇所は、

ClassB2 test4 = 6;

の部分です。
どのようにコンパイラが認識しているかというと、

ClassB2 test4 = ClassB2(6);

のように認識して、コンパイルしています。
つまり、explictなしで宣言されたコンストラクタは、予想外の型変換を引き起こすので、一般的には、explict付きで宣言されたコンストラクタのほうが良い。
したがって、特に理由がないならexplictを付けるように心がけようかと思います。
ちなみに、explictありで宣言されたコンストラクタのクラスを呼ぶ場合、

ClassB   test3 = 5;

のようにクラスを呼び出すと、コンパイルエラーとなります。

サンプルコード

intro_default_constructor2.cpp
# 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;
}

実行結果

intro_default_constructor2.png

参考文献

https://www.amazon.co.jp/gp/product/4621066099/ref=dbs_a_def_rwt_hsch_vapi_taft_p1_i0

1
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?