Effective C++ 49,50

3463 ワード

49.標準ライブラリに精通している.
C++標準ライブラリは大きいです.
まず標準ライブラリには関数が多く,名前の競合を避けるためにネーミングスペースstdを用いる.以前のライブラリ関数は<.h>では、擬似標準ライブラリとなります.これらのヘッダファイルを直接名前空間に追加することはできず、標準委員会は再作成するしかない.hのヘッダファイル.Cのヘッダファイルについては同様の方法を採用するが、Cのになりました.古いc++ヘッダファイルは公式には反対ですが、古いcヘッダファイルはそうではなく、Cへの互換性を維持するためです.は古いCヘッダファイルであり、char*ベースの文字列処理関数に対応している.はstdを含むC++ヘッダファイルであり、対応するのは新しいstringクラスであり、はCヘッダファイルのstdバージョンであるが、ここではstringクラスの古いc++バージョンはない.公式には推奨されていないためである.
第二に、ライブラリのほとんどがテンプレートです.iostreamのように、文字ストリームを操作すると、ストリームクラスは実際にクラステンプレートであり、ストリームクラスをインスタンス化するときに文字タイプを指定します.stringでも、タイプパラメータは各stringクラスの文字タイプを限定するテンプレートです.stringのタイプ宣言は次のとおりです.
typedef basic_string<char, char_traits<char>, allocator<char> >
	string;

ここでの文字タイプは、以前のiostreamの文字タイプと同じ意味で、charではなく、ストリームの文字を指します.ここで、文字タイプはパラメータを決定します.文字タイプは文字セットを指します.異なる文字セットは、実装の詳細が異なるため、特別なファイルの終了文字、彼らの配列をコピーする最も効果的な方法などです.これらの特徴は標準ではtraitsと呼ばれている.次に、stringオブジェクトが動的メモリ割り当てを実行する方法もあります.Allocatorパラメータを使用します.Allocatorタイプのオブジェクトは、メモリマネージャであるstringオブジェクトのメモリを割り当てて解放するために使用されます.標準ライブラリの一部を手動で宣言しないでください.
Iostreamは、従来のIostreamと比較してテンプレート化されており、継承階層も変更され、例外を投げ出す能力が増加し、string(stringstreamを通じて)と国際化(localesを通じて)をサポートしています.新しいIostreamはstringとファイルをストリームとすることができ、キャッシュと初期化を含むストリームの動作をより広く制御することができます.
コンテナ、標準ライブラリでは、vector、list、queue、stack、deque、map、set、bitsetの効率的な実装が提供されています.stringはコンテナであり、コンテナに対する任意の操作はstringに適用されます.標準ライブラリの実装は効率的です.コンテナを使用すると、動的なメモリ割り当てによるメモリ漏洩を解消できます.
アルゴリズムは、標準ライブラリにalgorithmと呼ばれる多くの簡単な方法を提供し、実際には関数テンプレートであり、その多くはライブラリ内のすべてのコンテナおよび内蔵配列に適用されます.アルゴリズムは、コンテナの内容をシーケンスとし、各アルゴリズムは、1つのコンテナ内のすべての値に対応するシーケンス、またはサブシーケンスを適用することができる.標準アルゴリズムは、for_eachはシーケンス内の各要素に関数を呼び出し、findはシーケンス内で値を含む最初の位置を検索し、count_if計算シーケンスで真と判定された要素の数を満たし、equalは2つのシーケンスに含まれる要素の値が完全に等しいかどうかを判断し、searchは1つのシーケンスの中であるサブシーケンスの開始位置を探し出し、copyは1つのシーケンスを別のシーケンスにコピーし、uniqueはシーケンスの中で再複素値を削除し、rotate回転シーケンスの値、sortはシーケンスの値をソートし、などである.コンテナ操作と同様に、アルゴリズムにも性能保証があります.
国際化へのサポート.国際化されたソフトウェアの開発に役立つ特性を提供します.国際化をサポートする最も主要なコンポーネントはfacetsとlocalesです.Facetsは、文化に対してどのような特性を処理するかを説明しています.ソート・ルールを含める(すなわち、一部の地域では文字セットの文字がどのようにソートされるべきか)、日付と時間がどのように表示されるべきか、数値と通貨値がどのように表示されるべきか、情報表現子を明確な言語情報にマッピングする方法などがあります.localesは複数のfacetsのグループを結合し、facetsは前述の特性の1つを指し、localesは複数のfacetsからなる1つのペアを表します.ある国のルールでは、localesがアメリカ人が前のいくつかの問題をどのように解決したかを示しています.
デジタル処理のサポート.C++ライブラリでは、複数クラスと数値プログラミングに特化した特殊な配列のテンプレートが提供されています.valarrayタイプのオブジェクトなど、任意に混在できる要素を保存するために使用できます.
診断サポート、標準ライブラリは3つのエラー報告方式をサポートします:Cの断言、エラー番号、例外exception.例外先派生logic_errorとruntime_Error、そしてこの2つのクラスから具体的なエラータイプが派生し、logic_Errorはソフトウェアにおける論理エラーを表し,理論的にはより詳細なプログラム設計によって防止できる.runtime_Errorタイプの例外は、実行時に検出されるエラーです.
標準ライブラリのコンテナおよびアルゴリズムの部分は、一般に標準テンプレートライブラリSTLと呼ばれる.STLは標準ライブラリの中で最も革新的な部分であり、そのアーキテクチャは拡張性があり、STLの規範に従って、多くの拡張を行うことができます.
50.C++に対する認識を高める.
C++設計における主な目標は,Cとの互換性,効率,従来の開発ツールおよび環境との互換性,実際の問題を解決するための応用性(すなわちオブジェクト向け)である.
以上の目標はC++言語における大量の実装の詳細を明らかにした.たとえば、暗黙的に生成されたコピー構造関数と付与演算子が、ポインタによって生成された浅いコピーの問題で、現在のように動作するのはなぜですか.これはC対structのコピーと付与方式なので、Cと互換性があります.なぜ構造関数はvirtualとして自動的に宣言されないのか、なぜ実装の詳細はクラスの定義に表示されなければならないのか.そうしないことは性能上の損失をもたらすので、効率が重要です.なぜC++は非局所静的オブジェクト間の初期化依存関係を検出できないのですか?C++は単独コンパイルをサポートするため(すなわち、ソースモジュールを別々にコンパイルし、複数のターゲットファイルをリンクして実行可能プログラムを形成する)、既存のリンクに依存してプログラムデータがやり取りされないため、c++コンパイラはプログラム全体のすべての状況をほとんど知ることができない.なぜC++は、メモリ管理や低レベルポインタ操作などの複雑なトランザクションからプログラマを解放しないのか.メンバーにはこれらの処理能力が必要であり、本当のプログラマーのニーズは重要です.