C++ Standard Library--Chapter 2 & Chapter 3

4668 ワード

Chapter 2 Introduction to C++ and the standardy library
 
この章は主にC++の歴史と特性について概括的に述べる.
C++の標準化の過程は1989年から始まり、1997年になってやっと終わった(標準を制定する過程は長く、多くの努力と協議を伴っている).しかし、著者の意思によれば、標準化はまだ完璧なレベルに達していないが、string、IO、データ構造、アルゴリズムなどの基本的なライブラリとコンポーネントが生成されている.実は標準化の目標はまったく新しいライブラリを開発するためではなく、既存のライブラリと設計理念を統合するためである(IOStreamクラスは良い例であり、1984年にすでにあり、互換性を追求するために、C++は元の実現を維持している)
 
STL(standardy template library)には多くのデータ構造とアルゴリズムがあり、実現過程においても言語の最良の効率を追求するためであるため、使用者はSTLをよく理解しなければならない.
 
著者も、標準化の過程は世界中の数百人が共同で参加し、無数の議論を経験したと述べた.1994年には、標準化プロセスを早期に終了させるために、制定者はより多くの拡張性を考慮しないことを決定したため、現在よく使われているhashテーブルなどのデータ構造は、標準に含まれていない.
 
新しい機能:
1.テンプレート.ほとんどのSTLはテンプレートの概念で実現されている.テンプレートとは、特にデータ型が明記されていないクラスや関数のことです.本には次のような例があります.
 
template <class T>
inline const T& max (const T& a, const T& b)
{
   //if a < b then use b else use a
   return a < b ? b : a;
}

上の例では,Tは任意のデータ構造であり,この関数を呼び出すときに指定する.多くのクラスもこの方法で実現されています.注意すべきは、templateテンプレートは一度だけコンパイルされるのではなく、コンパイラがテンプレートを使用する場所を見つけて、具体的なデータ構造に基づいてコンパイルすることです.したがって、テンプレートはコンパイル時に定義されている必要があります.通常、テンプレートはヘッダファイルに定義されます.病気はinlineを使って制限します(*inlineはマクロと似ていますが、もっと柔軟で、主な原理はinlineで定義した関数/変数を使う時、コンパイラは自動的に定義したコードをコピーして性能を高めます.注:コード量が大きくて頻繁に使う関数に対して逆にコードが膨張しすぎて性能を傷つけます).
 
2. typename.後ろに付いているタイプを表すのに使います.例:
 
template <class T>
Class MyClass {
   typename T::SubType * ptr;
   ...
};

ここでtypenameはSubTypeがTの中のタイプであることを宣言し,ptrはT::SubTypeを指すポインタである.typenameがない場合、SubTypeはTの静的メンバーとみなされ、T::SubType*ptrは2つの変数の積を意味する.またtypenameはclassを置き換えて使用することもできます.例えばtemplateclass MyClassです.
 
3.クラス内のメンバー関数もテンプレートである可能性があります.このプロパティはタイプの変換をサポートします.たとえば、関数はテンプレートとして定義されません.
 
template <class T>
class MyClass {
   private:
      T value;
   public:
      void assign (const MyClass<T>& x) {
      // x must have same type as *this
         value = x.value;
      }
       ...
};

ここでassign()関数を使用して1つのタイプのパラメータを入力すると、valueは自動的に同じタイプに変わります.エラーコールによりコンパイルエラーが発生します.
 
void f()
{
   MyClass<double> d;
   MyClass<int> i;

   d.assign(d); //OK
   d.assign(i); //ERROR: i is MyClass<int>, 
                      //but MyClass<double> is required
}

テンプレートを使用して定義すると、上記の文はエラーしません.
template <class T>
class MyClass<T> {
   private:
      T value;
   public:
      template <class X>                           //member templates
      void assign (const MyClass<X>& x) {//       
         value = x.getValue();
      }
      T getValue() const {
         return value;
      }
      ...
};

 
4.異常処理.try{}catch{}文
5.名前空間.クラス/関数などの名前の競合を防ぐために.
6. bool.booleanタイプ
7.explicitキーワード.入力タイプが一致するかどうかを確認し、cのように一致しないタイプを変換しません.
8.タイプ変換オペレータ
    a. static_cast.例:float x;cout << static_cast(x); 
    b. dynamic_cast.ベースクラスをサブクラス(多態性)に変換する例:
 
class Car; //abstract base class; has at least one virtual function

class Cabriolet : public Car {
   ...
};

class Limousine : public Car {
   ...
};

void f (Car* cp)
{
   Cabriolet* p = dynamic_cast<Cabriolet*>(cp);
   if (p == NULL) {
        //p did not comfort to Cabriolet
        ...
   }
}

   c. const_cast.constに変換するか、const制限をキャンセルします.volatile制限の解除
   d. reinterpret_cast.具体的な実現によって決まる.
 
9.main関数はint main(){...}としか定義できませんまたはint main(int argc,char*argv[]){...}またはint main(int argc,char**argv){...}です.最後にreturn文がない場合、c++はmain関数にreturn 0を自動的に追加します.しかし、一部のコンパイラではreturn文を追加しないことは許可されていません.
 
 
 
Chapter 3 Generic Concepts
 
本章では主にC++のいくつかの基本的な概念について述べた.
 
1.名前空間.主に関数/クラス名の競合を防止するために使用されます.
2.ヘッダファイル.C++の標準ライブラリのヘッダファイルはincludeの時に追加しない.h,.hpp,hxxの接尾辞.
3.errorとexceptionの処理.EXceptionをいくつかのカテゴリに分けました:言語特性をサポートするexception(bad_alloc、bad_castなど);標準ライブラリのexception(主にinvalid_argument、out_of_rangeなどのlogic error).実行時のexception(overflow、underflowなど).
4.allocatorディスペンサ.主にオブジェクトのメモリ割り当てと解放に用いられ、元のメモリ割り当てと解放にレイヤをカプセル化し、使用者はメモリがどのように割り当てられているのか、どのくらい割り当てられているのかなどを知る必要はありません.