C ++ 35

 

 

このリンクします。https://blog.csdn.net/orange_littlegirl/article/details/101203278
                   
               
                   
               
                                                   
            
            
           
                                       
                   
                   
                                            抽象クラスに設計された将来の緊張開発プログラム33非リーフクラス(非リーフクラス)の下での記事のディレクトリ32(抽象。標準C ++言語のサプリメント:. auto_ptrにサンプルコード慣れるどのようにC ++およびC35で同じプログラムに結合するためにクラス)34
一連の記事:
ノートを読み取るためのC ++ 35のヒント()を
読んリアクション(b)のためのC ++ 35個のヒント
35(c)のノートを読むためにC ++スキル
読書ノート(D)の35のC ++スキル
このノートのがより効果的な最後の35雑多セクションで
緊張し、将来的に32開発プログラム
設計時にクラス、決して、クラス(派生クラス)を導出することを意図した場合に1、それはスイングのようなコメントとしてヘッダファイルにちょうど上流階級であってはならないのではなく、C ++の構文が派生される防ぐために(節を参照してください26)。
2は、すべてのオブジェクトの実体の要件は、ヒープ内で生成されなければならないならば、我々は厳密にこの制約27の条項を適用する必要があります。
図3は、各クラスの割り当てとコピーコンストラクタアクションのためのプロセス、でも誰も使用している場合は、何が何の未来を意味しませんありませんしてください。
4、自然で直感的な構文とセマンティクスで演算子のクラスや関数を作成してみてください。疑いで、どのようにint型の種類、性能のを見て持っている場合:組み込みの行動一貫性の種類としてください。
5、正しく使用するように簡単にクラスを聞かせて簡単に悪用されることができないしてください、事実を「顧客は、間違いを犯すだろう」と、自分のクラスを阻止する能力を持って設計し、検出または訂正受け入れてください。
6、ポータブルなコードを書くためにあなたの最善を尽くしてください。
ローカライズされた「システムが変更の影響によってもたらさ」ように7は、あなたのコードを設計してください。これまでのパッケージの性質上、可能な限り、可能な限り民間になっ分解を達成するために。そのような派生クラスを初期化する必要がありますそれぞれのクラスとして設計された仮想基底クラスを、避けてください。
8は、たとえ現在のいくつかの部分未満の完全classes--を提供します。
図9は、あなたのインターフェースを設計するので、協力行動を助長していること、一般的なミスを防ぎます。
10、巨大な悪影響がない限り、あなたのコードの一般化(一般化)を作ってみます。あなたは、コードの再利用性を高め、その保守性を強化し、それをより強固にし、促進することができることを考えるのは、「将来の思考」を使用してみてください「必然的なエクササイズを変更、」環境が変化し、エレガントました。
抽象クラス(抽象クラス)として設計された33の非リーフクラス(非リーフクラスは、)
「アイソタイプ割り当て」方法はポインタ「形状割り当て」にすることによって防止されることができます。
図1は、2つの代入演算子のオーバーロードによって、仮想あり、通常バージョンです。この方法では達成が、お勧めできませんすることができます。
2、オペレータは=プライベート関数の動物になってみましょう。
クラス動物
{
プライベート:
動物&operatro =(CONST動物&RHS)。
...
};
クラスリザード:公共動物{
パブリック:
トカゲ&演算子=(CONSTトカゲ&RHS)。
...
};
クラスチキン:公共動物{
パブリック:
チキン&演算子=(CONSTチキン&RHS)。
...
};
 
リザードliz1、liz2。
...
liz1 = liz2。//很好
チキンchick1、chick2。
...
chick1 = chick2。//很好
 
動物* pAnimal1 =&liz1。
アニマル* pAnimal2 =&chick1。
...
* pAnimal1 = * pAnimal2。//错误、企图调用民間動物::演算子=
 
残念なことに、動物は、具象クラスであり、この方法は、動物が互いの間でオブジェクトのような割り当て動作が有効でないと述べた。
動物animal1、animal2;
animal1 = animal2;
1234567891011121314151617181920212223242526272829303132
正しいアプローチは次のとおりです。「相互割り当て動物のオブジェクトを許可する」、および問題の最も簡単なアプローチを完了する必要の排除は、動物は抽象クラスであることをさせることです、動物をインスタンス化することはできません。オリジナルデザインの動物がお互いに割り当てられた場合、新しい抽象クラスAbstractAnimalに変更します。
AbstractAnimalクラス
{
保護:
    AbstractAnimal&演算子=(定数&AbstractAnimal RHS);
公共:
    仮想〜AbstractAnimal()= 0; //一般的なデストラクタが純粋仮想関数であるように、少なくとも、純粋仮想関数を持つ必要がある
...
};
クラスアニマル:公共AbstractAnimal
{
パブリック:
    動物&operatro =(CONST動物&RHS);
...
};
クラスリザード:公共AbstractAnimal {
パブリック:
    トカゲ&演算子=(CONSTトカゲ&RHS);
...
};
クラスチキン:公共AbstractAnimal {
公共。
    演算子=チキン(チキン&CONST RHS)&;
...
};
123456789101112131415161718192021222324
機能「純粋仮想関数」は、コードを実装していないことを意味し、それは意味しません。
1、現在のクラスが抽象的です。
2は、任意の特定のクラスは、このクラスは、通常の仮想関数の再純粋仮想関数(すなわち、それはもはや= 0を作ることができる)として宣言する必要があります継承します。
ライブラリがある場合は、継承させたい特定のクラス、(エンティティクラスから新しいクラスライブラリを派生)は、次のプラクティスがあります。
図1は、具体的には既存の具象クラス(プログラムライブラリ)から誘導され、割当関連の問題の検証、及び慎重に関連する落とし穴の配列の最初の項は3に関して記載ことに留意すべきです。
2、あなたが必要な機能のほとんどは、それを継承した抽象クラス継承システムライブラリ、より高いレベルを探してみてください。
3、あなた自身の新しいカテゴリを達成するために、たとえば、あなたがオブジェクトライブラリのクラスは、あなたのデータメンバーになるために作ることができ、その後、あなたの新しいクラスでプログラムライブラリを再実装「あなたが継承するライブラリクラス」インタフェースクラス。
4、派生クラスを書き換えることなく、非メンバ関数でのプログラムの増加を修正するためのライブラリのクラスを使用します。
34.同じプログラムでC ++とCを結合する方法
1は、名前マングリング(名前の符号化)、自分の名前でCの関数をオーバーロードすることはできません。抑止名前の符号化するためには、C ++のextern「C」ディレクティブを使用する必要があります。
extern "C" {
ボイドdrawLine(INT X1、Y1 INT)。
無効シミュレート(int型の反復)。
}
1234
図2に示すように、静的な初期化は、主な機能は、一般に、静的オブジェクトの初期設定、静的配置デストラクタオブジェクト内の最も後端挿入操作の開始端です。
3、動的メモリ割り当て、malloc関数(およびその変異体)とフリーを使用してプログラムの新しい、削除、C部の一部を使用してC ++プログラム。
図4に示すように、二つの言語間でのデータ構造の互換性、「伝送データ構造は、」Cの形態に限定されるもので理解することができ、それが触れた場合に、非仮想関数を含むC ++構造体はそのように限定されません。
35. GETは、標準C ++言語を使用しました

年間で以来、ARM(注釈付きC ++リファレンスマニュアル)出版、C ++で最も重要な変更のいくつかは次の通りです:
1、いくつかの新しい言語が特徴追加:RTTI、名前空間、ブール値、キーワードmutableと明示的に、列挙型を最もオーバーロードされた関数引数の型は、プロモーション変換を引き起こし、そしてへの能力の「クラス定義された領域は、最初の整数のconst静的クラスのメンバーを指示するために設定されています」。
図2は、弾性テンプレートの拡張:受け、メンバーテンプレートが存在許可受付機能テンプレート「非型引数」クラステンプレートは、別のテンプレート引数として使用することができる可能に、標準的な構文「スポットの明確な指示は、テンプレートをインスタンス化します」。
図3に示すように、拡張例外処理メカニズム:
4、メモリ割り当てプロセスを変更:オペレータ新しい[]と、オペレータは、例外がスローされたときにメモリの割り当てが成功するために、] [削除し、0を返すメモリが失敗参加、
図5に示すように、追加された新しい遷移をフォーム:.はstatic_cast、dynamic_castを、const_castをし、reinterpret_castは
6を、よりエレガントで洗練された言語の規則:あなたは仮想関数を再定義する場合、その戻り値の型は、必ずしも元の定義と正確に一致しなければならなくなりました。

STL標準ライブラリの変更:
1、C標準ライブラリをサポートしています。
2、文字列のサポート。
3、ローカリゼーションのサポート。
4、I / Oのためのサポート
5、数値計算アプリケーションのためのサポート。複合等
6、コンテナ(容器)とアルゴリズム(アルゴリズム)多目的サポート。

補足:auto_ptrはサンプルコード
コード例1つのauto_ptrは
テンプレート<クラスT>
クラスauto_ptrは{
パブリック:
    明示的なのauto_ptrは(T * P = 0)。
    テンプレート<クラスU>
    auto_ptrは(auto_ptrは<U>&RHS)。
 
    〜auto_ptrは();
    テンプレート<クラスU>
    auto_ptrを<T>&演算子=(auto_ptrは<U>&RHS)。
    T&演算子*()constは、
    T *演算子- >()constは、
    T *のget()constは、
    T *リリース();
 
    ボイドリセット(T * P = 0)。
プライベート:
    T *指示先。
    テンプレート<クラスU>
    フレンドクラスのauto_ptr <U>。
}。
 
テンプレート<クラスT>
テンプレート<クラスU>
    インラインauto_ptrを<T> :: auto_ptrは(auto_ptrは<U>&
 
テンプレート<クラスT>
    インラインauto_ptrを<T> ::〜auto_ptrは(){削除指示先。}
 
テンプレート<クラスT>
テンプレート<クラスU>
    インラインauto_ptrを<T>&auto_ptrを<T> ::演算子=(auto_ptrを<T>&RHS)
    {
        IF(この=&RHS!)リセット(rhs.release())。
        *これを返します。
    }
 
テンプレート<クラスT>
    インラインT&auto_ptrを<T> ::演算子*()constは{リターンポインタの指示。}
 
テンプレート<クラスT>
    Tインライン* auto_ptrを<T> ::演算子- >()constは{リターンポインタの指示。}
 
テンプレート<クラスT>
    インラインT * auto_ptrを<T> ::()constは{リターンポインタの指示を取得します。}
 
テンプレート<クラスT>
    インラインT * auto_ptrを<T> ::


        指示先= 0;
        oldPointeeを返します。
    }
 
テンプレート<クラスT>
    インラインボイドauto_ptrを<T> ::リセット(T * P)
    {
        IF(!指示先= P){
            削除指示先。
            指示先= P;
        }
    }
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
コード例2 auto_ptrは
//所有函数都定义在クラス定义区内:
テンプレート<クラスT>
クラスauto_ptrは{
パブリック:
    明示auto_ptrは(T * P = 0):ポインタの指示(P){}
 
テンプレート<クラスU>
    auto_ptrは(auto_ptrは<U>& RHS):ポインタの指示(rhs.release()){}
    〜auto_ptrは(){削除指示先:}
 
テンプレート<クラスU>
    auto_ptrを<T>&演算子=(auto_ptrは<U>&RHS)
    {
        IF(この=&RHS)!リセット(rhs.release())。
        *これを返します。
    }
 
    T&演算子*()constは{リターン*指示先。}
    T *演算子- >()constは{リターンポインタの指示。}
    T *のget()cosnt {リターンポインタの指示。



        指示先は= 0であり、
        リターンoldPointee;
    }
 
    無効RESET(T * P = 0)
    {
        IF(ポインティング先は= Pです!){
        削除指示先があり、
        指示先がある= P;
        }
    }
 
プライベート:
    Tは、*指示先であり、
    テンプレート<クラスU->フレンドクラスのauto_ptr <
U>;
}; ----------------
免責事項:この記事は、元の記事のCSDNのブロガーのsu帆」で、CC 4.0 BY-SAの著作権契約に従うが、再現しました元のソースのリンクと、この文を添付してください。
オリジナルリンクします。https://blog.csdn.net/orange_littlegirl/article/details/101203278

おすすめ

転載: www.cnblogs.com/skydaddy/p/11928959.html