2013年11月5日火曜日

Effective C++ 読書会メモ Item 1

Effective C++ 読書会のメモです。原書を使用しているため誤訳があるかもしれません。

Item1. View C++ as a federation of languages

C++は最初、Cにオブジェクト指向を加えただけの言語"C with Classes"だった。 しかしException、template、STLが加わって派手で大胆な言語に変化した。

C++は手続き型、オブジェクト指向、関数型、generic、メタプログラミングをサポートするmultiparadigm言語 このような機能と柔軟性においてC++は他に類を見ない言語だが、筋の通った書き方をするのは難しい。 最も簡単な方法は、C++を言語の複合体として見ること。 特定のサブ言語に限定すれば、構造はシンプルで覚えやすい。 C++は以下4つのサブ言語から成り立っていることを意識しよう。

1. C
C++はCを基礎としている。ブロックや文、組み込み型、配列、ポインタなどはCから来ている。 しかし、C++は同等の機能をよりスマートに実現できる。 具体例: Item2(プリプロセッサの代替)やItem13(オブジェクトによるリソース管理)

2. オブジェクト指向C++
元来の"C with Classes"そのもの。 クラス・カプセル化・継承・ポリモーフィズム・仮想関数など。

3. テンプレートC++
C++のジェネリックプログラミングを実現する構成要素であり、おそらくほとんどのプログラマにとって最も馴染みの薄い機能。 テンプレートはとても強力で、テンプレートメタプログラミング (TMP)という完全に新しいパラダイムを生み出した。 テンプレートプログラミング専用の節も用意している。(Item46やItem48)

4. STL
特別なテンプレートライブラリで、コンテナ、イテレータ、algorithm、関数オブジェクトが美しく調和している。 STLを利用する時は、STLの作法に沿うことを求められる。

以上が4つのサブ言語。 あるサブ言語から別のサブ言語に切り替える時に効果的なプログラミングが変化しても驚かないで欲しい。 たとえばC言語の組み込み型では値渡しが参照渡しよりも高速だが、C言語からオブジェクト指向C++に移った時、ユーザー定義のコンストラクタとデストラクタが存在するオブジェクトはたいていconst参照渡しが値渡しよりも速くなる。また、このことはテンプレートC++を使った時に顕著になる。どんな型のオブジェクトが引数で渡されるかわからないからだ。しかしSTLを使うとき、イテレータや関数オブジェクトは再び値渡しが高速になる。

このように、C++は一つのルールに基づく統一された言語ではなくサブ言語の複合体で、それぞれが独自の規約を持つ。 このことを理解すれば、C++をより簡単に理解できるようになるはずだ。

Things to Remember

効果的なC++プログラムの書き方はC++のどの部分を使うかによって変化する。

0 件のコメント:

コメントを投稿