■
今日はちょこっとプログラムのことについて書いてみましょうかね。私は今仕事で、C++を主に使っています。「学生のころからC++使ってきたんだし、楽勝でしょ?」みたいなことをよく言われますが、まったくそんなことはありません。会社に入ると独自ルールのコーディング規約があったり、学生のころは知りもしなかったテクニック等学ぶことはたくさんあります。いや、それ以前に膨大なC++のすべての言語仕様やライブラリの中にはかつて見たことのないものが数多くありました。今回はそんな知ってそうで知らないC++のTIPSを少々。「そんなの常識だろ!」って人もいるでしょうが・・・。
まずは知っているようで知らないメンバーイニシャライザについて・・・。
#includeclass member{ private: int a; int b; public: member(){ a=1; b=2; } member(int x){ a=x; b=x; } }; class owner{ private: int c; member d; public: owner(){ c=3; } owner(int x){ c=x; //Any constructors other than a default cannot be called. } }; ・ ・ ・ ・
ownerクラスはメンバとしてmemberクラスのオブジェクトdを持っています。ownerクラスが生成されるとコンストラクタが呼ばれて、通常この中で各メンバの初期化が行われるわけですがクラスがメンバにいる場合デフォルトコンストラクタ以外のコンストラクタを呼ぶことができないので少々不便です。そこでメンバイニシャライザを使って次のようにします。
#includeclass member{ private: int a; int b; public: member(){ a=1; b=2; } member(int x){ a=x; b=x; } }; class owner{ private: int c; member d; public: owner(){ c=3; } owner(int x):d(x){ // Calling any constructers using the member initializer. c=x; } }; ・ ・ ・ ・
まぁ、常識と言えば常識ですね。私はメンバーイニシャライザっていうのはこういう風に使うものだと認識しておりました。しかし、わが社のコーディングルールに則るとこのプログラムはさらに次のようになります。
#includeclass member{ private: int a; int b; public: member():a(1),b(2){ } member(int x):a(x),b(x){ } }; class owner{ private: int c; member d; public: owner():c(3){ } owner(int x):d(x){ // Calling defalt constructer using the member initializer. c=x; } }; ・ ・ ・ ・
メンバーイニシャライザの名のとおり、すべてのメンバの初期化の際にメンバーイニシャライザを使用しています。ソースは短くなりましたが、ぱっと見なにをやっているのか見えづらいですね。私は最初に会社のソースを見たときに何をやっているのかちんぷんかんぷんでした。しかし、メンバの初期化の際はメンバーイニシャライザを使用したほうが、実行速度が向上するのでこのようにしているそうです。
う〜む、結構長くなってしまった。まだまだあるのですが、続きはまた今度。