最近、コンストラクタ・デストラクタについて
- デフォルトコンストラクタとは実引数の指定が不要なコンストラクタのこと
- デフォルトコンストラクタを定義しないと、空のデフォルトコンストラクタがコンパイラによって生成されること
- 仮引数を持つコンストラクタがあると、デフォルトコンストラクタを自身で定義しなければならないこと
の以上3点を学びました。
コンストラクタ・デストラクタを用いて、プログラムの実行時間を表示するクラス(?)を作ってみたのですが、このクラス(下記参照)は仮引数を持つコンストラクタがあるにもかかわらず、デフォルトコンストラクタを自身で定義しなくとも、問題なくコンパイル(g++)・実行できてしまいました。
質問:
この場合、measure(option flag) {...}
がこのクラス(?)のデフォルトコンストラクタとして扱われていると考えてよいのでしょうか。
仮にその場合、実引数の指定があるにもかかわらず、何故measure(option flag) {...}
がデフォルトコンストラクタとして扱われているのでしょうか。
私はプログラミング初心者なので、記法をはじめとして、このコードに対する指摘・アドバイスなどあればそれも併せて教えていただけると幸いです。
よろしくお願いします。
C++
1#include <iostream> 2#include <chrono> 3 4namespace function { 5 enum option : bool { 6 able = true, 7 disable = false 8 }; 9 struct measure { 10 measure(option flag) { 11 _flag = flag; 12 if(flag) { 13 start = std::chrono::steady_clock::now(); 14 } 15 } 16 ~measure() { 17 if(_flag) { 18 end = std::chrono::steady_clock::now(); 19 elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start); 20 std::cout << "\ntime: " << elapsed.count() << " ms" << std::endl; 21 } 22 } 23 private: 24 option _flag; 25 std::chrono::steady_clock::time_point start, end; 26 std::chrono::milliseconds elapsed; 27 }; 28} 29 30int main() { 31 function::measure(function::able); 32 // action 33 return 0; 34}
Output
1 2time: 0 ms