C / C ++ - 基本概念

メモリ

  • 管理スタック領域とヒープ領域が異なっている:システムメモリの割り当てと解放することによりスタック領域、プログラマ制御せずに、ヒープメモリが完全にプログラマによって制御され、どのくらいの割り当てにどのくらいの配分を考える、ときにそれを解放するときのように、非常に柔軟リリース。
  • スタック(積み重ね)がローカル配列関数内など、関数の引数、ローカル変数のスコープのデータを格納することができ、その目的は、関数呼び出しを完了することです。
  • メモリのスタック領域とヒープ領域は、プログラムは、すべてのメモリの十分な供給に開始されていないだけで、実際の需要とリリースに基づいて、プログラムの実行時に割り当てることができます。これは、動的なメモリ割り当てとして知られています。
  • スタックオブジェクト上に作成されたが、それは必要ありませんへのポインタを使用して、このようSTUとして、名前が付いています。しかし、出て作成された新しいオブジェクトによって同じではありません、それはヒープメモリ上に確保され、名前のないあなたは、ポインタを受け取るためにポインタ変数を使用しなければならないので、唯一、それへのポインタを取得し、そうでなければ、もはやオブジェクトを見つけることができますより多くのそれを使用する方法はありません。それは直接使用することはできません、あなたはそれへのポインタを使用する必要があり、ヒープ上に新しいオブジェクトを作成するためにそれを使用して匿名で、で、そのメンバ変数やメンバ関数にアクセスするためのポインタを持ちます。
  • スタックメモリは、あなたがスタック上に作成されたオブジェクトを削除するには、[削除]を使用することはできません、自動的に管理され、使用が削除を通じてプログラマによって管理することができた後、オブジェクトが削除されたヒープメモリの後。実際の開発では、新しいとペアで頻繁に削除し、タイムリーに削除を確実にするためには役に立たないメモリの蓄積を防ぐために、使用されなくなっオブジェクトありません。
  • オブジェクト・ポインタと、矢印によって->アクセスオブジェクトメンバ変数とメンバ関数に、これにより、構造体ポインタをアクセスする同様の部材。
  • メンバー変数は、ヒープメモリ領域又はスタック領域、コード領域にメモリを割り当てるメンバ関数を割り当てられました。唯一のメンバ変数とメンバ関数によって影響を受けるオブジェクトのサイズは重要ではありません。

ポインタ、参照

  • 自然指定パラメータの割り当てに渡すプロセスは、メモリをコピーすることです。メモリの別の部分へのデータのメモリのブロックをコピーする、いわゆるメモリコピー手段。
  • などint型、float型、char型、などの基本データ型の場合、彼らはメモリの数バイトだけを占有する傾向があり、彼らは非常に高速なメモリコピーです。配列があり、長いプロセスになる可能性が真剣なスキルを防ぐために、プログラムの効率を遅くするメモリがそれらをコピーし、小さくてもよく、それは数万人であってもよいし、データの数が限定されるものではなく、データの集まりです非効率的なコードを書くための貧しいプログラマは、C言語は文法からのデータセットの直接割り当てをサポートしていません。
  • C言語に加えてC ++JavaのPythonの  メモリの他の言語のチャンクは、底部ポインタが達成される使用して、同様の方法で、コピーを禁止されています。
  • C / C ++は、  直接配列伝達関数呼び出しの内容を禁止するが、転送アレイ強制ポインタを、構造上のそのような制限やオブジェクトは、関数ポインタを呼び出すときに、コンテンツを直接送信してもよい通過することはできない。ために効率を向上させるために、私たちは、ポインタを渡すことをお勧めします。
  • C ++では、我々は、ポインタ型データ移動重合、より便利な方法有する参照(リファレンス)
  • 参考データは、エイリアスの名前の別名として見ることができ、元のは、このデータを得ることができました。
  • ポインタの形よりもより直感的な基準の使用により通過パラメーター。C ++プログラミングの後、私は多数の文献を使用するように読者を奨励、それは一般的に(C ++でのコースも不可欠ポインタ)ポインタで置き換えることができ、C ++標準ライブラリには、そうすることです。
  • 実際には、単純なパッケージのためだけに参照ポインタは、それが64ビット環境で、32ビット環境であり、4バイトのポインタによって達成され、ポインタは、メモリ長のメモリフットプリントを占有参照基礎となるまだコンパイラが内部変換を行ったので、彼がアドレスを取得できませんでしたことを8つのバイトは、引用しました。
  • 参照ポインタベースの実装が、それはポインタよりも簡単に使用でき、それ上記の2つの例から見て、ポインタを介してデータを取得する必要がありますすることができ*、トラブルを書き、必要参照することはない、それは使用変数に共通しています同じ。C ++発明者ビャーネ・ストロヴストルップは、直接の目的、彼はC ++での参照を紹介し、特に中に、書き込みコードをより美しくするためにあると言っ演算子オーバーロード時々演算子の使用は非常に面倒されます参照の助けを借りずに、で。
  • ポインタと参照の違い
    • 規定の基準を初期化する必要があり、以降も忠実、他のトランザクションを示すことができ、ポインタは、データが可能な任意の点の後に割当てを定義する必要がない場合、ポインタは、これに限定されるものではありません
    • あなたはのconstポインタではなくconst参照を持つことができます。
    • ポインタは、複数のレベルであることができるが、唯一つの基準があり得ます
    • ( - )マイナスからの引用ポインタとインクリメント(++)演算子は同じ意味ではありません

マクロ、インライン関数

  • マクロ定義は、「小さな思考非常に密度の高い」仕事で、誤ってプログラムに隠れて横たわって、コンパイルおよび実行時発見に必ずしもピットを踏んで、そしてありません。
  • オーバーヘッド時空関数呼び出しを除去するために、C ++は、コンパイル時に関数呼び出しと同様体の機能に置き換えられている、より効率的な方法で、提供C言語マクロ膨張します。関数呼び出しでこの直接埋め込み、関数も組み込み関数またはインライン関数としても知られている関数をインライン(インライン関数)と呼ばれています。
  • C ++のコードを書くとき、私はパラメータを置き換えるために、インラインマクロ機能を使用することをお勧めします。
  • 翻訳機能の完了が存在しないので、リンクが重複定義エラーにつながることはありません後、コンパイル時にインライン関数は、関数本体で関数呼び出しに置き換えられます。これと多くのマクロのように、マクロは、前処理中に展開され、何のコンパイル時はありません。この観点から、より多くのコンパイル時のマクロのようなインライン関数。
  • このセクションとセクションのコンテンツを統合し、あなたがインライン関数は、関数呼び出しのオーバーヘッドを排除する2つの主要な機能、1を持って見ることができ、第二には、引数付きマクロを置き換えることです。しかし、私はより良いハイライトに代わり、マクロ引数の、インライン関数の存在意義を、後者を好みます。
  • 機能が複雑な場合には、時空間関数呼び出しのオーバーヘッドが無視できる程度である我々は、一般的に非常に短い関数がインライン宣言されていることになるので、CPU時間のほとんどは、関数本体のコードの実装に費やされます。

クラス、オブジェクト

  • クラスはちょうどテンプレート(テンプレート)で、メモリ空間がコンパイルされるまで反映されません、それはデータを格納する場所がないため、メンバ変数は、クラスの定義で初期化されているではありません。これだけの時間がアップ割り当てることができ、オブジェクトを作成した後、メンバ変数のためのメモリを割り当てます。
  • publicC ++は、キーワードを追加して、それが唯一のクラスで定義することができ、またはメンバ変数が表すクラスのメンバ関数は、「オープン」のアクセス権を持っています
  • クラスは、新しいデータ型として理解することができ、データ型は、学生の名前です。そして、CHAR、int型、float型、などの違いは、基本データ型は、学生は、基本型が含むことができる複合データ型であるが、基本的な特性の多くの種類が存在しないということです。
  • スタックオブジェクト上に作成されたが、それは必要ありませんへのポインタを使用して、このようSTUとして、名前が付いています。しかし、出て作成された新しいオブジェクトによって同じではありません、それはヒープメモリ上に確保され、名前のないあなたは、ポインタを受け取るためにポインタ変数を使用しなければならないので、唯一、それへのポインタを取得し、そうでなければ、もはやオブジェクトを見つけることができますより多くのそれを使用する方法はありません。それは直接使用することはできません、あなたはそれへのポインタを使用する必要があり、ヒープ上に新しいオブジェクトを作成するためにそれを使用して匿名で、で、そのメンバ変数やメンバ関数にアクセスするためのポインタを持ちます。
  • スタックメモリは、あなたがスタック上に作成されたオブジェクトを削除するには、[削除]を使用することはできません、自動的に管理され、使用が削除を通じてプログラマによって管理することができた後、オブジェクトが削除されたヒープメモリの後。実際の開発では、新しいとペアで頻繁に削除し、タイムリーに削除を確実にするためには役に立たないメモリの蓄積を防ぐために、使用されなくなっオブジェクトありません。
  • オブジェクト・ポインタと、矢印によって->アクセスオブジェクトメンバ変数とメンバ関数、それは同様の構造体へのポインタを介してアクセスされるメンバーです。
  • このセクションのハイライトは、オブジェクトを作成する2つの方法を説明します:1はスタック、同様のフォームや共通の変数の定義に作成されます。他には、作成する新しいキーワードを使用してヒープである、あなたがリーダーに、それへのポインタを使用する必要があります。もはや使用されるオブジェクトを削除しないことを忘れないでください。
  • アクセス部材小数点数へのオブジェクト名を使用して.、アクセス部材にオブジェクトポインタを介して矢印を使用して->、この構造は非常に類似しています。
  • クラスで定義されている場合、外側メンバ関数は、関数名の前に定義するクラス名を追加する必要があります。::解像度演算子は、現在の機能を示すために、クラス名と機能名を接続するためのどのクラスに属し、ドメイン(また、スコープオペレータまたは範囲修飾子と呼ばれる)と呼ばれます。
  • メンバ関数は、ファーストクラスのボディは、関数定義の前の位置にあるべきであること、そしてクラスの定義に、プロトタイプクラス本体で宣言する必要があります。
  • インビトロおよび定義されたクラスベース本体部材の機能が区別される:クラス本体内に定義されたメンバ関数は自動的にインライン関数であるクラスインビトロで定義されていません、。もちろん、クラス本体内に定義された関数は、インラインキーワードを追加することができますが、内部の身体機能定義されたクラスのデフォルトは、インライン関数であるので、これは、不必要です。
  • インライン関数は、我々が期待したもの、一般的ではない、それは私が声明を作るために、クラスのメンバ関数本体内のことを示唆して、身体の機能と関数呼び出しに置き換えられますし、良いプログラミングの練習で外部クラス本体、で定義されていますみんなの実際の開発は、そうすることです。
  • C ++のメンバのアクセス修飾子として知られている官民を表すパブリック、保護、民間の3つのキーワード、保護された、スルーメンバ変数とメンバ関数へのアクセスを制御します。いわゆるアクセスは、クラスのメンバを使用できないことです。
  • クラス外部(定義されたクラスコード外側)に、唯一のパブリックプロパティのメンバーによってアクセス可能なオブジェクト部材を介してオブジェクトにアクセスし、保護性のプライベートメンバーにアクセスすることはできません。
  • するメンバ変数のほとんどm_で始まるが、それは文言ではなく、構文指定されたコンテンツに下品な合意されています。するにはm_、両方のメンバ変数である一目で見ることができ、およびパラメータ名でのメンバ関数のことが可能と区別することで始まります。
  • 唯一のクラスの使用中に(のみメンバ関数は、メンバ関数と呼ばれている)C ++ソフトウェアの設計仕様、実際のプロジェクト開発のメンバ変数とメンバ関数によると、プライベートとして宣言し、メンバーのみがオブジェクトの呼び出しによって宣言が機能できるように推奨されています公共。プライベートとして宣言され、このメンバ変数は、関数の宣言は、パブリックカプセル化アプローチのクラスの一部のメンバーを反映​​しています。いわゆるパッケージは、実装のみメンバーユーザーに有用な機能を提供するために、可能な限り隠さする内部クラスを指します。
  • 一般的に集合関数と呼ばれる変数に割り当てた値にメンバ関数、それらの名前がで通常、setメンバ変数の名前が続き、当初、メンバ変数の関数値は、関数を読んでは、多くの場合、その名前は通常、取得するために参照されるgetメンバ変数に続いて、で始まります名前。
  • 各メンバ変数を初期化するコンストラクタを呼び出すことができますShihai内のオブジェクトを作成するために設定した機能および取得機能に加えて、私たちは「になりますC ++コンストラクタの議論」セクション。しかし、メンバ変数の割り当てにだけコンストラクタは一度、後で援助セット関数を修正する必要がありました。
  • 一部の読者は、直接保存するには、パブリックおよびより変動のメンバーに、多くの問題を設定する追加機能を追加し、機能を得るために、と言うかもしれません!99.9%のケースはそれほど間違いではないんでは実際に、私はそうする何も間違ってはないと思いますが、特に中規模のプロジェクトでのソフトウェアの設計仕様にプライベートメンバ変数、またはこの原則に従ってみてください。
  • 任意の順序で、民間と公共のメンバーのステートメントのメンバーとして宣言され、いずれかの最初のプライベートの部分が来る、あなたは最初のパブリックセクションに表示することができます。もしどちらもプライベートでも書き込み書き込み官民がデフォルト。
  • コンストラクタを呼び出すことは必須であると呼ばれなければならなかった、クラスで定義されたコンストラクタたら、あなたは、オブジェクトを作成するとき、間違って呼び出すことはありません。複数のオーバーロードコンストラクタが存在する場合、オブジェクトと一致するコンストラクタを作成する際に、引数が与えられなければならない。逆に、オブジェクトが作成されるとき、唯一のコンストラクタが呼び出されます。
  • あなたがスタック上にオブジェクトを作成すると、例えば、オブジェクト名の後ろの引数は、Student stu("小明", 15, 92.5f);ヒープ上のオブジェクトを作成し、それは例えば、クラス名引数の後に配置されていますnew Student("李华", 16, 96)
  • コンストラクタは、そうでない場合は、オブジェクトを作成するときに呼び出すことはできません、パブリックプロパティでなければなりません。もちろん、エラーになりませんプライベート、保護されたプロパティに設定されますが、意味がありません。
  • 何の変数無駄な場合は、戻り値を受け取るがないのでコンストラクタは、値を返しません。この手段:宣言または定義のいずれかは、ボイドが許可されていない場合でも、関数名の戻り値の型の前に現れることができない;関数本体は、return文を持つことができません。
  • 場合は特に、多くのメンバ変数リストを初期化するコンストラクタを使用して効率にも利点がありません、それは、単に便利書き込みにあり、このようなアプローチは非常にシンプルで簡単です。
  • 順序独立変数の初期化シーケンスと記載されているメンバ変数の初期化リストは、順序で唯一のメンバ変数は、当該クラスに宣言しました。
  • constメンバ変数を初期化する唯一の方法は、初期化リストを使用することです。
  • デストラクタ(デストラクタが。)は戻り値、プログラマの必要性が明示的に(明示的に呼び出すために、プログラマではない)を呼び出していないしていないが、オブジェクトが破壊されたときに自動的に実行される特別なメンバ関数です。クラスコンストラクタの名前と同じ名前が、名前を加え、クラス名の前にあるデストラクタである~シンボル。
  • C ++は  newとdelete割り当てるために使用されており、空きメモリをされているC言語で使用する場合は、新しいメモリの割り当てが使用削除リリースメモリ中にコンストラクタの意志を呼び出します。最大の違いの()自由はmallocでは()、ということですデストラクタを呼び出します。クラスのコンストラクタとデストラクタはとてもC ++に強くnewとdeleteを使用することが推奨されている、不可欠です。
  • あなたは、同時に複数のファイルをコンパイルすると、最初の変数や関数に加えて、静的な場合、それは他のソースファイルから非表示になります。名前の競合を気にせずに、同じ名前と異なるファイルに同じ名前の関数と変数を定義することができ、この機能を使用します。

変換、仮想関数、多型

  • クラスは、データ型、データ型の変換が発生する可能性が実際にあるが、唯一のベースと派生クラスとの間のこの変換は、理にかなっている、とのみ割り当てに派生クラスのオブジェクトを含む基本クラスに派生クラスを割り当てることができオブジェクトの基本クラス、派生クラスのポインタベースポインタに割り当てられ、派生クラスの参照は、C ++(アップキャスト)に遷移アップと呼ばれるグループに割り当てられた引用します。したがって、派生クラスの割り当てに基底クラスが下方遷移(ダウンキャスト)と呼ばれています。
  • 仮想関数、基本クラスのオブジェクトをポイント(メンバ変数とメンバ関数を含む)は、ベースクラスのメンバーの使用に関する基底クラスのポインタと、派生クラス派生オブジェクトのポインティング部材を使用します。つまり、基底クラスが邪魔に係る作業へのポインタ基底クラスであってもよいし、物事を行うには、クラスの方法を導出することができる、それは様々な形態を持っているか、多くの点で明らかに、我々はこの現象を呼んでいる(多型を多型)
  • C ++は、多型オブジェクトを提供する:「満杯」であることができる特定のメンバ関数の基本クラスによって、(派生直接的および間接的誘導体を含む)すべての派生クラスのアクセスメンバ変数とメンバ関数を指します。何の多型が存在しない場合、我々は唯一のメンバ変数にアクセスすることができます。

 

参照

スタックまたはヒープ上のオブジェクトを作成します。

https://blog.csdn.net/weixin_33682790/article/details/92378612

おすすめ

転載: www.cnblogs.com/cxc1357/p/11781192.html