C ++でのプログラミングの問題のある偎面


C ++には、朜圚的に危険ず考えられる機胜がかなりありたす-蚭蚈の蚈算ミスや䞍正確なコヌディングにより、簡単に゚ラヌに぀ながる可胜性がありたす。 この蚘事では、このような機胜の遞択を提䟛し、それらの悪圱響を枛らす方法に関するヒントを提䟛したす。




目次


目次

はじめに
1.タむプ
1.1。 条件付き呜什ず挔算子
1.2。 暗黙的な倉換
2.名前解決
2.1。 ネストされたスコヌプ内の倉数の非衚瀺
2.2。 関数のオヌバヌロヌド
3.コンストラクタ、デストラクタ、初期化、削陀
3.1。 コンパむラヌによっお生成されたクラスメンバヌ関数
3.2。 初期化されおいない倉数
3.3。 基本クラスず非静的クラスメンバヌの初期化順序
3.4。 静的クラスメンバヌずグロヌバル倉数の初期化手順
3.5。 デストラクタの䟋倖
3.6。 動的オブゞェクトず配列の削陀
3.7。 クラス宣蚀が䞍完党な堎合の削陀
4.挔算子、匏
4.1。 オペレヌタヌの優先床
4.2。 オペレヌタヌの過負荷
4.3。 郚分匏を蚈算する手順
5.仮想機胜
5.1仮想関数のオヌバヌラむド
5.2デフォルトパラメヌタのオヌバヌロヌドず䜿甚
5.3コンストラクタヌずデストラクタヌでの仮想関数の呌び出し
5.4仮想デストラクタ
6.メモリを䜿甚した盎接䜜業
6.1オヌバヌランバッファヌ
6.2 Zで終わる文字列
6.3可倉数のパラメヌタヌを持぀関数
7.構文
7.1耇雑な発衚
7.2構文のあいたいさ
8.その他
8.1キヌワヌドむンラむンおよびODR
8.2ヘッダヌファむル
8.3 switchステヌトメント
8.4倀によるパラメヌタヌの受け枡し
8.5リ゜ヌス管理
8.6所有リンクず非所有リンク
8.7バむナリ互換性
8.8マクロ
9.たずめ
参照資料



プレモニトゥス、プレ゚ムニトゥス。
事前譊告ずは歊装を意味したす。 lat。



はじめに


C ++には、朜圚的に危険ず考えられる機胜がかなりありたす-蚭蚈の蚈算ミスや䞍正確なコヌディングにより、簡単に゚ラヌに぀ながる可胜性がありたす。 それらのいく぀かは、困難な子䟛時代に起因するもの、叀いC ++ 98暙準に起因するものもありたすが、他のものは、最新のC ++の機胜に既に関連付けられおいたす。 䞻なものを怜蚎し、それらのマむナスの圱響を枛らす方法に぀いおアドバむスを䞎えおください。



1.タむプ



1.1。 条件付き呜什ず挔算子


Cずの互換性の必芁性は、 if(...)などのステヌトメントで、 boolような匏だけでなく、任意の数倀匏たたはポむンタヌを眮き換えるこずができるずいう事実に぀ながりたす。 この問題は、算術匏のboolからintぞの暗黙的な倉換ず䞀郚の挔算子の優先床によっお悪化したす。 これにより、たずえば次の゚ラヌが発生したす。


if(a=b) when if(a==b) 、
if(a<x<b) when if(a<x && x<b) 、
if(a&x==0)正しいif((a&x)==0) 、
if(Foo) when when if(Foo()) 、
if(arr)正しくif(arr[0])堎合、
if(strcmp(s,r)) when when if(strcmp(s,r)==0) 。


これらの゚ラヌの䞀郚はコンパむラの譊告を匕き起こしたすが、゚ラヌは匕き起こしたせん。 コヌドアナラむザヌも圹立぀堎合がありたす。 Cでは、そのような゚ラヌはほずんど䞍可胜ですbool if(...)などはbool型を必芁ずするため、算術匏にbool型ず数倀型を混圚させるこずはできたせん。


戊う方法




1.2。 暗黙的な倉換


C ++は厳密に型指定された蚀語を指したすが、コヌドを短くするために暗黙的な型倉換が広く䜿甚されおいたす。 これらの暗黙的な倉換は、堎合によっおぱラヌに぀ながる可胜性がありたす。


最も厄介な暗黙の倉換は、数倀型たたはポむンタヌのboolぞの倉換ずboolからintぞの倉換です。 セクション1.1で説明されおいる問題を匕き起こすのは、これらの倉換Cずの互換性のために必芁です。 暗黙的な倉換も垞に適切であるずは限らず、たずえばdoubleからintぞの数倀デヌタの粟床の䜎䞋倉換の瞮小を匕き起こす可胜性がありたす。 倚くの堎合、コンパむラは譊告を生成したす特に数倀デヌタの粟床が䜎䞋する可胜性がある堎合が、譊告ぱラヌではありたせん。 Cでは、数倀型ずbool間の倉換は明瀺的であっおも犁止されおおり、数倀デヌタの粟床が倱われる可胜性のある倉換はほずんど垞に゚ラヌです。


プログラマは、他の暗黙的な倉換を远加できたす。1 explicitキヌワヌドなしで1぀のパラメヌタヌでコンストラクタヌを定矩するこずにより。 2型倉換挔算子の定矩。 これらの倉換は、匷力なタむピングの原則に基づいお、远加のセキュリティギャップを突砎しおいたす。


Cでは、組み蟌みの暗黙的な倉換の数ははるかに少なく、 implicitキヌワヌドを䜿甚しおカスタムの暗黙的な倉換を宣蚀する必芁がありたす。


戊う方法




2.名前解決



2.1。 ネストされたスコヌプ内の倉数の非衚瀺


C ++では、次の芏則が適甚されたす。 させお


 //   {    int x;    // ... //  ,       {        int x;        // ...    } } 

C ++ルヌルに埓っお、 宣蚀された倉数は、 宣蚀された倉数隠したす xの最初の宣蚀はブロック内にある必芁はありたせん。クラスたたはグロヌバル倉数のメンバヌにするこずができ、ブロックで衚瀺される必芁がありたす


次のコヌドをリファクタリングする必芁がある状況を想像しおください


 //   {    int x;    // ... //  ,       {    // -         } } 

誀っお、倉曎が行われたす。


 //   {    //  , :    int x;    // -         // ...    //  :    // -      } 

そしお今、「䜕かがから で行われおいる」ずいうコヌドは、 からの䜕かをするでしょう すべおが以前のように機胜しないこずは明らかであり、倚くの堎合非垞に難しいものを芋぀けるこずです。 Cでは、ロヌカル倉数を隠すこずは犁止されおいたすクラスメンバヌはできたすが。 いずれかの圢匏で倉数を非衚瀺にするメカニズムは、ほずんどすべおのプログラミング蚀語で䜿甚されおいるこずに泚意しおください。


戊う方法




2.2。 関数のオヌバヌロヌド


関数のオヌバヌロヌドは倚くのプログラミング蚀語に䞍可欠な機胜であり、C ++も䟋倖ではありたせん。 ただし、この機䌚は慎重に䜿甚する必芁がありたす。そうしないず、問題が発生する可胜性がありたす。 たずえば、蚭蚈者が過負荷になっおいる堎合、プログラマには遞択肢がない堎合もありたすが、過負荷の拒吊を正圓化できる堎合もありたす。 オヌバヌロヌドされた関数を䜿甚するずきに発生する問題を考慮しおください。


オヌバヌロヌドを解決するずきに発生する可胜性のあるすべおのオプションを怜蚎しようずするず、オヌバヌロヌドを解決するためのルヌルが非垞に耇雑になるため、予枬が困難になりたす。 テンプレヌト関数ず組み蟌み挔算子のオヌバヌロヌドにより、远加の耇雑さが導入されたす。 C ++ 11は、右蟺倀リンクず初期化リストに問題を远加したした。


ネストされたスコヌプ内のオヌバヌロヌドを解決するための候補の怜玢アルゎリズムによっお問題が発生する可胜性がありたす。 コンパむラヌが珟圚のスコヌプで候補を芋぀けた堎合、さらなる怜玢は終了したす。 芋぀かった候補が適切ではない、競合する、削陀される、たたはアクセスできない堎合、゚ラヌが生成されたすが、それ以䞊の怜玢は詊行されたせん。 そしお、珟圚のスコヌプに候補がない堎合のみ、怜玢は次のより広いスコヌプに移動したす。 名前隠蔜メカニズムは機胜したす。これはセクション2.1で説明したものずほが同じです。[Dewhurst]を参照しおください。


関数をオヌバヌロヌドするず、コヌドの可読性が䜎䞋する可胜性がありたす。぀たり、゚ラヌが発生したす。


既定のパラメヌタヌを持぀関数を䜿甚するず、オヌバヌロヌドされた関数を䜿甚するように芋えたすが、もちろん朜圚的な問題は少なくなりたす。 しかし、可読性が䜎く、゚ラヌの可胜性があるずいう問題は残っおいたす。


现心の泚意を払っお、仮想関数のオヌバヌロヌドおよびデフォルトパラメヌタを䜿甚する必芁がありたす。セクション5.2を参照しおください。


Cは関数のオヌバヌロヌドもサポヌトしおいたすが、オヌバヌロヌドを解決するためのルヌルは少し異なりたす。


戊う方法




3.コンストラクタ、デストラクタ、初期化、削陀



3.1。 コンパむラヌによっお生成されたクラスメンバヌ関数


プログラマヌが次のリストデフォルトコンストラクタヌ、コピヌコンストラクタヌ、コピヌ代入挔算子、デストラクタからクラスのメンバヌ関数を定矩しおいない堎合は、コンパむラヌがこれを行うこずができたす。 C ++ 11では、このリストに移動コンストラクタヌず移動割り圓お挔算子が远加されたした。 これらのメンバヌ関数は、特別なメンバヌ関数ず呌ばれたす。 それらは䜿甚される堎合にのみ生成され、各機胜に固有の远加の条件が満たされたす。 この䜿甚が完党に隠されおいる可胜性があるこずに泚意しおくださいたずえば、継承を実装する堎合。 必芁な機胜を生成できない堎合、゚ラヌが生成されたす。 再配眮操䜜を陀き、それらはコピヌ操䜜に眮き換えられたす。コンパむラヌによっお生成されるメンバヌ関数は、パブリックで埋め蟌み可胜です。 特別なメンバヌ関数の詳现は[Meyers2]にありたす。


堎合によっおは、コンパむラからのそのようなヘルプは「ベアサヌビス」になりたす。 カスタムの特別なメンバヌ関数が存圚しないず、些现な型が䜜成される可胜性があり、これにより、初期化されおいない倉数の問題が発生したす。セクション3.2を参照しおください。 生成されたメンバヌ関数はパブリックであり、これは垞にクラスの蚭蚈ず䞀貫しおいるずは限りたせん。 基本クラスでは、コンストラクタヌを保護する必芁がありたす;オブゞェクトのラむフサむクルをより现かく制埡するには、保護されたデストラクタが必芁になる堎合がありたす。 クラスにメンバヌずしお生のリ゜ヌス蚘述子があり、このリ゜ヌスを所有しおいる堎合、プログラマはコピヌコンストラクタ、コピヌ割り圓お挔算子、およびデストラクタを実装する必芁がありたす。 いわゆる「ビッグ3のルヌル」はよく知られおおり、プログラマヌが3぀の操䜜コピヌコンストラクタヌ、コピヌ割り圓お挔算子、たたはデストラクタヌの少なくずも1぀を定矩する堎合、3぀すべおの操䜜を定矩する必芁がありたす。 コンパむラヌが生成する移動コンストラクタヌず移動割り圓お挔算子も、垞に必芁なものずはほど遠いものです。 コンパむラによっお生成されるデストラクタは、堎合によっおは非垞に埮劙な問題を匕き起こし、リ゜ヌスリヌクを匕き起こす可胜性がありたす。セクション3.7を参照しおください。


プログラマヌは、特別なメンバヌ関数の生成を犁止できたす。C++ 11では、C ++ 98で、察応するメンバヌ関数をprivateずしお宣蚀し、定矩しない堎合、 "=delete"構文を䜿甚する必芁がありたす。


プログラマヌがコンパむラヌによっお生成されたメンバヌ関数に慣れおいる堎合、C ++ 11では、宣蚀をドロップするだけでなく、これを明瀺的に瀺すこずができたす。 これを行うには、宣蚀時に"=default"構文を䜿甚する必芁がありたすが、コヌドは読みやすく、アクセスレベルの制埡に関連する远加機胜が衚瀺されたす。


Cでは、コンパむラヌはデフォルトのコンストラクタヌを生成できたす。通垞、これは問題を匕き起こしたせん。


戊う方法




3.2。 初期化されおいない倉数


コンストラクタずデストラクタは、C ++オブゞェクトモデルの重芁な芁玠ず呌ぶこずができたす。 オブゞェクトを䜜成するずコンストラクタが呌び出され、削陀するずデストラクタが呌び出されたす。 しかし、Cずの互換性の問題により、いく぀かの䟋倖が匷制され、この䟋倖は単玔型ず呌ばれたす。 これらは、コンストラクタヌずデストラクタヌの必須呌び出しなしで、倉数のsichnyタむプずsyshnyラむフサむクルをシミュレヌトするために導入されたした。 C ++でコンパむルおよび実行される堎合、CコヌドはCずたったく同じように動䜜したす。通垞の型には、数倀型、ポむンタヌ、列挙、および単玔な型で構成されるクラス、構造䜓、共甚䜓、配列が含たれたす。 クラスず構造は、カスタムコンストラクタ、デストラクタ、コピヌ、仮想関数が存圚しないずいう远加条件を満たしおいる必芁がありたす。 取るに足らないクラスの堎合、コンパむラはデフォルトのコンストラクタずデストラクタを生成できたす。 デフォルトのコンストラクタヌはオブゞェクトをれロにし、デストラクタは䜕もしたせん。 ただし、このコンストラクタヌは、倉数の初期化時に明瀺的に呌び出された堎合にのみ生成および䜿甚されたす。 明瀺的な初期化のバリアントを䜿甚しない堎合、自明なタむプの倉数は初期化されたせん。 初期化構文は、倉数宣蚀のタむプずコンテキストに䟝存したす。 静的倉数ずロヌカル倉数は、宣蚀時に初期化されたす。 クラスの堎合、盎接の基本クラスず非静的クラスメンバヌは、コンストラクタヌ初期化リストで初期化されたす。 C ++ 11では、宣蚀時に非静的クラスメンバヌを初期化できたす。埌述。動的オブゞェクトの堎合、匏new T()はデフォルトコンストラクタヌによっお初期化されたオブゞェクトを䜜成したすが、簡易型のnew Tは初期化されおいないオブゞェクトを䜜成したす。 些现なタむプの動的配列new T[N]を䜜成する堎合、その芁玠は垞に初期化されたせん。 std::vector<T>むンスタンスが䜜成たたは拡匵され、芁玠の明瀺的な初期化にパラメヌタヌが提䟛されない堎合、それらは既定のコンストラクタヌを呌び出すこずが保蚌されたす。 C ++ 11では、䞭括匧を䜿甚した新しい初期化構文が導入されおいたす。 括匧の空のペアは、デフォルトのコンストラクタヌを䜿甚した初期化を意味したす。 このような初期化は、埓来の初期化が䜿甚されるすべおの堎所で可胜です。さらに、宣蚀時にクラスの非静的メンバヌを初期化するこずが可胜になり、コンストラクタヌ初期化リストの初期化を眮き換えたす。


初期化されおいない倉数は、次のように構成されたす。 namespaceスコヌプグロヌバルで定矩されおいる堎合、すべおのビットがれロになりたす。ロヌカルたたは動的に䜜成される堎合、ランダムなビットセットを受け取りたす。 このような倉数を䜿甚するず、プログラムの予期しない動䜜が発生する可胜性があるこずは明らかです。


確かに、最新のコンパむラヌでは、進行が止たらないこずがありたす。堎合によっおは、初期化されおいない倉数を怜出しお゚ラヌをスロヌしたす。 さらに良いのは、コヌドアナラむザヌによっお初期化されおいない倉数が怜出されるこずです。


C ++ 11暙準ラむブラリには、タむププロパティヘッダヌファむル<type_traits> ず呌ばれるテンプレヌトがありたす。 そのうちの1぀を䜿甚するず、タむプが簡単かどうかを刀断できたす。 匏std::is_trivial<>::valueは、 T自明な型であればtrue Tそうでなければfalseです。


シシル構造は、Plain Old DataPODずも呌ばれたす。 PODず「自明なタむプ」はほが同等の甚語であるず想定できたす。


Cでは、初期化されおいない倉数ぱラヌを匕き起こしたす;これはコンパむラヌによっお制埡されたす。 明瀺的な初期化が実行されない堎合、参照型のオブゞェクトのフィヌルドはデフォルトで初期化されたす。 重芁なタむプのオブゞェクトのフィヌルドは、デフォルトですべお初期化されるか、明瀺的にすべお初期化する必芁がありたす。


戊う方法




3.3。 基本クラスず非静的クラスメンバヌの初期化順序


クラスコンストラクタヌを実装するず、盎接の基本クラスず非静的クラスメンバヌが初期化されたす。 初期化順序は、暙準によっお決定されたす。最初に、基本クラスのリストで宣蚀されおいる順序で基本クラス、次に宣蚀順序でクラスの非静的メンバヌ。 必芁に応じお、基本クラスず非静的メンバヌの明瀺的な初期化では、コンストラクタヌの初期化リストを䜿甚したす。 残念ながら、このリストの項目は、初期化が発生する順序である必芁はありたせん。 初期化䞭にリストアむテムが他のリストアむテムぞの参照を䜿甚する堎合、これを考慮する必芁がありたす。 ゚ラヌの堎合、参照はただ初期化されおいないオブゞェクトぞの可胜性がありたす。 C ++ 11では、宣蚀するずきに䞭括匧を䜿甚しお非静的クラスメンバヌを初期化できたす。 この堎合、コンストラクタヌの初期化リストで初期化する必芁はなく、問題は郚分的に陀去されたす。


Cでは、オブゞェクトは次のように初期化されたす。最初に、ベヌスサブオブゞェクトから最埌の掟生物たで、フィヌルドが初期化され、次にコンストラクタヌが同じ順序で呌び出されたす。 説明されおいる問題は発生したせん。


戊う方法




3.4。 静的クラスメンバヌずグロヌバル倉数の初期化手順


静的クラスメンバ、およびさたざたなコンパむル単䜍ファむルのスコヌプnamespace グロヌバルで定矩された倉数は、実装によっお決定された順序で初期化されたす。 初期化䞭にこのような倉数が盞互に参照を䜿甚する堎合、これを考慮する必芁がありたす。 リンクは初期化されおいない倉数ぞのリンクである可胜性がありたす。


戊う方法




3.5。 デストラクタの䟋倖


デストラクタは䟋倖をスロヌしないでください。 この芏則に違反するず、未定矩の動䜜、ほずんどの堎合異垞終了が発生する可胜性がありたす。


戊う方法




3.6。 動的オブゞェクトず配列の削陀


䜕らかのタむプT動的オブゞェクトT


 T* pt = new T(/* ... */); 

その埌、 delete挔算子で削陀されたす


 delete pt; 

動的配列が䜜成された堎合


 T* pt = new T[N]; 

その埌、 delete[]挔算子でdelete[]されたす


 delete[] pt; 

この芏則に埓わない堎合、未定矩の動䜜が発生する可胜性がありたす。぀たり、メモリリヌク、クラッシュなど、あらゆるこずが起こりたす。 詳现に぀いおは、[Meyers1]を参照しおください。


戊う方法




3.7。 クラス宣蚀が䞍完党な堎合の削陀


delete挔算子の雑倚さは、特定の問題を匕き起こす可胜性がありたす; void*型のポむンタヌたたは䞍完党なプリ゚ンプティブ宣蚀を持぀クラスぞのポむンタヌに適甚できたす。 クラスぞのポむンタヌに適甚されるdelete挔算子は2フェヌズ操䜜であり、デストラクタが最初に呌び出され、次にメモリが解攟されたす。 ゚ラヌの宣蚀が䞍完党なクラスぞのポむンタヌにdelete挔算子を適甚するず、゚ラヌは発生せず、コンパむラヌは単にデストラクタヌの呌び出しをスキップしたす譊告は発行されたす。 䟋を考えおみたしょう


 class X; //   X* CreateX(); void Foo() {    X* p = CreateX();    delete p; } 

このコヌドは、完党なXクラス宣蚀がdeleteダむダルピアで利甚できない堎合でもコンパむルされたす。 Visual Studioは次の譊告を衚瀺したす。

warning C4150: deletion of pointer to incomplete type 'X'; no destructor called


XずCreateX()実装がある堎合、コヌドはCreateX()たすCreateX()がnew挔算子によっお䜜成されたオブゞェクトぞのポむンタヌを返す堎合、 Foo()呌び出しFoo()正垞に実行され、デストラクタは呌び出されたせん。 これがリ゜ヌスの流出に぀ながる可胜性があるこずは明らかであるため、譊告に泚意する必芁があるこずを改めお説明したす。


この状況は、決しお倧げさではありたせん。スマヌトポむンタヌや蚘述子クラスなどのクラスを䜿甚する堎合に発生する可胜性がありたす。 このような状況が発生するず、コンパむラによっお生成されるデストラクタが刺激される可胜性がありたす。 , , , , . [Meyers2].


:




4. ,



4.1。


++ , . . . , 1.1.


:


 std::out<<c?x:y; 


 (std::out<<c)?x:y; 

じゃない


 std::out<<(c?x:y); 

, , .


. << ?: std::out void* . ++ , . -, , . ?: . , ( ).


: x&f==0 x&(f==0) , (x&f)==0 , , , . - , , , , .


別の䟋。 / . / , /, . , x/4+1 x>>2+1 , x>>(2+1) , (x>>2)+1 , .


C# , C++, , - .


:




4.2.


++ , . . , , . 4.1. — + += . . , : , (), && , || 。 , (-), (short-circuit evaluation semantics), , . & ( ). & , .. .


, - (-) , . .


- , , . . [Dewhurst].


C# , , , .


:




4.3.


++ , . ( : , (), && , || , ?: .) , , , . :


 int x=0; int y=(++x*2)+(++x*3); 

y .


, . 以䞋に䟋を瀺したす。

 class X; class Y; void Foo(std::shared_ptr<X>, std::shared_ptr<Y>); 

Foo() :


 Foo(std::shared_ptr<X>(new X()), std::shared_ptr<Y>(new Y())); 

: X , Y , std::shared_ptr<X> , std::shared_ptr<Y> . Y , X .


:


 auto p1 = std::shared_ptr<X>(new X()); auto p2 = std::shared_ptr<Y>(new Y()); Foo(p1, p2); 

std::make_shared<Y> ( , ):


 Foo(std::make_shared<X>(), std::make_shared<Y>()); 

. [Meyers2].


:




5.



5.1。


++98 , ( ), , ( , ). virtual , , . ( ), , , . , , . , ++11 override , , , . .


:




5.2。


. , , . . . [Dewhurst].


:




5.3。


, , . , , post_construct pre_destroy. , — . . , : ( ) . (, , .) , ( ), ( ). . [Dewhurst]. , , .


— - .


, C# , , , . C# : , , . , ( , ).


:




5.4。


, , delete . , - .


:




6.


— C/C++, . . . « ».


C# unsafe mode, .



6.1.


/++ , : strcpy() , strcat() , sprinf() , etc. ( std::vector<> , etc.) , . (, , , . . Checked Iterators MSDN.) , : , , ; , .


C#, unsafe mode, .


:




6.2. Z-terminated


, . , :


 strncpy(dst,src,n); 

strlen(src)>=n , dst (, ). , , . . — . if(*str) , if(strlen(str)>0) , . [Spolsky].


C# string .


:




6.3.


... . printf - , C. , , , , . , .


C# printf , .


:




7.



7.1。


++ , , , . 以䞋に䟋を瀺したす。


 const int N = 4, M = 6; int x,                // 1    *px,              // 2    ax[N],            // 3    *apx[N],          // 4    F(char),          // 5    *G(char),          // 6    (*pF)(char),      // 7    (*apF[N])(char),  // 8    (*pax)[N],        // 9    (*apax[M])[N],    // 10    (*H(char))(long);  // 11 

:


  1. int ;
  2. int ;
  3. N int ;
  4. N int ;
  5. , char int ;
  6. , char int ;
  7. , char int ;
  8. N , char int ;
  9. N int ;
  10. M N int ;
  11. , char , long int .

, . ( .)


* & . ( .)


typedef ( using -). , :


 typedef int(*P)(long); PH(char); 

, .


C# , .


:




7.2。


.


 class X { public:    X(int val = 0); // ... }; 


 X x(5); 

x X , 5.


 X x(); 

x , X , x X , . X , , :


 X x; X x = X(); X x{};    //   C++11 

, , , . [Sutter].


, , C++ ( ). . ( C++ .)


, , , , .


C# , , .


:




8.



8.1. inline ODR


, inline — . , . inline (One Defenition Rule, ODR). . , . , ODR. static : , , . static inline . , , ODR, . , . - , -. .


:




8.2.


. . , , , , .


:




8.3. switch


— break case . ( .) C# .


:




8.4.


++ , — , — . ( class struct ) , . ( , # Java.) — , .


  1. , . ( std::string , std::vector , etc.), , .
  2. , , .
  3. , (slicing), , .

, , , . . , , . , . . — ( =delete ), — explicit .


C# , .


:




8.5.


++ . , . - ( ), ++11 , , , .


C++ .


C# , . , . (using-) Basic Dispose.


:




8.6.


«» . , , C++ , STL- - .


. . , . . «», . COM- . (, .) , C++ . — . . . , («» ) , . .


# , . — .


:




8.7.


C++ , : , , . ( !) . , . , . , , . (, .)


C ( ), C++ C ( extern "C" ). C/C++ .


-. #pragma - , , .


, , , .


, , COM. COM-, , ( , ). COM , , .


C# . , — , C#, C# C/C++.


:




8.8. マクロ


, . , . C++ . 代わりに


 #define XXL 32 


 const int XXL=32; 

. inline .


# ( ).


:




9.


  1. . . . , .
  2. .
  3. . ++ — ++11/14/17.
  4. - , - .
  5. .



[Dewhurst]
, . C++. .: . 英語から — .: , 2012.


[Meyers1]
, . C++. 55 .: . 英語から — .: , 2014.


[Meyers2]
, . C++: 42 C++11 C++14.: . 英語から -M。LLC "I.D. », 2016.


[Sutter]
, . C++.: . 英語から — : «.. », 2015.


[Spolsky]
, . .: . 英語から — .: -, 2008.






Source: https://habr.com/ru/post/J428898/


All Articles