C++プログラミングのいくつかの原則



1.コンテナでauto_を使用できないptr、boostのshareを使うptr.具体的な原因はauto_を調べることができますptrの特性.
 
2.vectorは使用しないでください.
 
3.派生クラスをベースクラスに直接割り当てると、派生クラス固有の情報が失われます.したがって,この場合,派生クラスのポインタをベースクラスのポインタ変数にポインタで割り当てることが望ましい.
 
4.std::mapを生成するとき、キー値は任意のクラスであってもよい.このクラスが比較サイズの操作を定義している限り.
 
5.付与コピーと構築付与(copy constructor and assignment operator)が定義されていない場合はprivateに設定します.
 
6.派生クラスが構造関数を定義する必要がある場合は、ベースクラスの構造関数を虚関数に設定します.
 
7.ヘッダファイルで「using namespace」を定義しない
 
8.c++では常に#includeを用いる、#include .他のヘッダファイルは似ています.9.複雑なオブジェクトは、値による伝達ではなく、できるだけconst referenceで伝達します.
 
10大きいデータをstackの中で置かないでください、Must be<64 kb
11.non-const static変数の使用を避け、使用する場合は保護措置を講じる.12 assert文で式の計算を行わないでください.
13リンクをコンパイルするときのwarnning情報は、クリアする必要があります.
 
14.multimapに[]オペレータを使用しないでください.サポートされていません.multimapの代わりにmapを使用できます.
 
15.STLの容器にeraseまたはinsertを行った後、確定できない場合は、既にある参照とポインタと反復器が失効していると仮定します.それぞれの容器の効果は違います.各容器の紹介を調べることができます.
 
16.自分のクラスを定義するには、「c++沈思録」のクラス設計者審査表を参照してください.後に文章を添付します.
 
17.後で補充する
 
 
 
 
付録:
完全なクラスを定義する方法
 
クラスを定義する際に明らかにしなければならないいくつかの問題:
  • は関数を構築する必要がありますか?答えがnoの場合、コンストラクション関数の用途は明確に定義された状態でオブジェクトを設定するため、クラスではなく構造を定義する必要がある可能性があります.
  • データメンバーはプライベートですか?一般的に、データ・メンバーが共有されている場合、これらのメンバーがいつアクセスされるかを制御するのは難しいです.
  • パラメータのない構造関数が必要ですか?クラスにコンストラクション関数がすでに存在し、クラスのオブジェクトを宣言するときに表示して初期化する必要がない場合は、パラメータのないコンストラクション関数を表示して書く必要があります.(特に、このクラスのオブジェクト配列を生成する必要がある場合!)
  • 各コンストラクション関数は、すべてのデータ・メンバーを初期化しましたか?オブジェクトのステータスは、オブジェクトのデータ・メンバーによって反映されるため、各コンストラクション関数には、すべてのデータ・メンバーに明確に定義された値を設定する責任があります.コンストラクション関数がそれを行わなかった場合、エラーが発生する可能性があります.△もちろん、この言い方は必ずしも正しいとは限らない.データ・メンバーの中には、そのオブジェクトに一定の時間が存在してからしか意味がない場合があるからだ.
  • 構造関数は必要ですか?すべてのクラスが構造関数を必要とするわけではありません.一般に、クラスにリソースが割り当てられ、メンバー関数によって自動的に解放されない場合、クラスには構造関数が必要です.
  • 虚析构関数は必要ですか?ベースクラスでないクラスは、仮想構造関数を必要としません.仮想構造関数は継承された場合にのみ使用されます.deleteベースクラスのタイプのポインタが発生する可能性がありますが、実際にはサブクラスのオブジェクトを表しています.このベースクラス定義には虚析関数が必要です.
  • レプリケーションコンストラクタは必要ですか?クラスのデフォルトのレプリケーションコンストラクタでクラスのオブジェクトをレプリケーションする場合、クラスのデータメンバーとベースクラスのオブジェクトを完全にレプリケーションできる場合は、コンストラクタをレプリケーションする必要はありません.そうしないと必要です.特に、クラスがコンストラクション関数にリソースを割り当てたり、メンバー関数にリソースを割り当てたりした場合、リソースを管理するために表示されるレプリケーションコンストラクション関数が必要になる可能性があります.空の構造関数を除く構造関数を持つクラスは、通常、構造関数を使用してリソースを解放します.これは、通常、構造関数のコピーが必要であることを示します.
  • には割り当てオペレータが必要ですか?クラスがコンストラクション関数をコピーする必要がある場合は、ほとんどの場合、割り当てオペレータが必要です.もちろん、クラス内のオブジェクトをユーザーが設定したくない場合は、割り当てオペレータをプライベートとして宣言できます.
  • 割り当てオペレータは、オブジェクト自体にオブジェクトを正しく割り当てることができますか?自己付与はよく犯す間違いです!割り当ては、ターゲットオブジェクトの古い値の代わりに常に新しい値を使用します.元のオブジェクトとターゲットオブジェクトが同じで、「古い値を解放してから新しい値をコピーする」という原則を実行している場合は、コピーが実施されない前に元のオブジェクトを破棄する可能性があります.
  • リレーショナルオペレータを定義する必要がありますか?クラスをstlのコンテナに入れる必要がある場合は、リレーションシップオペレータを定義する必要があります.新しいオブジェクトをコンテナに追加するには、新しいオブジェクトとコンテナに既存のオブジェクトを比較する必要があります.たとえば、等しい比較を行い、サイズの比較を行います.したがって、クラスが論理的に等しい操作をサポートしている場合、operator==とoperator!=とてもメリットがあります.同様に、クラスの値にソート関係がある場合は、operator<またはoperator>などの関係オペレータを指定できます.これらのコンテナがクラスの秩序化された集合を作成する必要がある場合は、リレーショナルオペレータを指定する必要があります.
  • 配列を削除するときにdelete[]を使うことを覚えていますか?任意のタイプの配列を削除するときにdelete[]を使用するのは良い習慣です.
  • コピーコンストラクション関数と付与コンストラクション関数のパラメータタイプにconstを追加しましたか?これはいくつかのC++著作でも犯す間違いです!関数に参照パラメータがある場合は、関数の入力パラメータを変更したい場合にのみconstで参照パラメータを宣言する必要はありません.通常、この変更される入力パラメータも出力パラメータの役割を担っています.
  • メンバー関数をconstとして適切に宣言したことを覚えていますか?メンバー関数がオブジェクトを変更する必要がないと確信した場合はconstとして宣言できます.
  • 上記のすべての特性クラス定義を必要とする例
    	//   	
    class A{
    public:
    A();
    virtual ~A();
    A(const A& s);
    A& operator=(const A& s);
    bool operator==(const A& s) const;
    bool operator!=(const A& s) const;
    bool operator<(const A& s) const;
    };

    //
    A::A(){
    // todo...
    }

    A::~A(){
    // todo...
    }

    A::A(const A& s){
    // todo...
    }

    A& A::operator=(const A& s){
    if(&s != this){
    // todo...
    }
    return *this;
    }

    bool A::operator==(const A& s) const{
    // todo...
    return false;
    }

    bool A::operator!=(const A& s) const{
    return !((*this)==s);
    }

    bool A::operator<(const A& s) const{
    // todo...
    return false;
    }
  • .