C ++要約(C)

A、C ++の動的なメモリ管理:

図1に示すように、C / C ++ランタイム:のメモリ分布
ここに画像を挿入説明
スタックダウン等スタックスタック、非静的ローカル変数/関数パラメータ/戻り値として知られている、増加します。
Bは、セグメントが動的共有メモリバンクをロードするための効率的なメモリマップI / Oマッピングモードです。ユーザは、プロセス間通信を行い、共有メモリへの共有インターフェースを作成するためにシステムを使用することができます。(Linuxはこれを学び、今だけを見てする必要はありませんもちろん場合)
C、。プログラムが実行されている動的なメモリ割り当てのヒープは、ヒープが成長しています。
D、データセグメント-グローバルデータおよび静的データを格納します。
E、スニペット-実行可能コード/読み取り専用の定数。
2は、malloc関数/のcalloc / reallocの三つの機能の違い
、3つすべてに割り当てられたメモリは、STDLIB.Hライブラリは関数であるが、いくつかの違いがあります。
(1)malloc関数。これはプロトタイプvoid * malloc関数(unsigned int型のnum_bytesバイト) ;
スペースnum_byte適用するように、我々はintとして、計算するのに手動で必要* P =(int型)はmalloc(20ではsizeof(int型))、コンパイラのデフォルトのint 4の場合80は、連続空間の最初のアプリケーション、ポインタpに割り当てられたint型のベースアドレス空間とキャストを、バイト、この時点でアプリケーションメモリ値が不確定である、記憶領域のバイトは、計算結果が80バイトです。
(2)のcalloc関数プロトタイプvoid *のcalloc(size_tのN、size_tのサイズ)。
malloc関数よりもマルチパラメータがあり、彼はint型アプリケーション空間20を入力したい場合は* pはint型になる、例えば、人工的スペースのサイズを計算する必要はありません=(int型*)はcalloc(20、はsizeof(int型))、 そのためこれは、人工スペース計算の手間がなくなります。しかし、これは、それらの間の最も重要な違いはありませんが、mallocのアプリケーションスペースの値はのcallocながら、しかし、1つずつ初期宇宙の適用後に、初期化ランダムではなく、0に値を設定し、
(3)のreallocプロトタイプvoidのrealloc、上記2つの本質的に異なる機能(ボイド* ptrは、size_tの new_Size)
ダイナミックメモリの拡張のために使用される(動的空間とアプリケーション、スペース必要拡張操作を使用していない)、PTR点まで元にスペースポインタベースアドレス、次に必要なサイズのためnew_size容量拡張。

3、malloc関数/自由と新しいの違いは/削除します

  • 共通:アプリケーション・ヒープ・スペースからの両方、および手動で解除することをユーザに要求。
  • 違いは次のとおりです。
  1. これは、mallocとfree、newとdelete演算子は機能しています
  2. 宇宙のmallocのアプリケーションは、新しい缶初期化を初期化しません
  3. ときにmalloc宇宙用途、手計算と転送スペース、スペースを維持するだけで、その後の新しい新しいタイプ
  4. ヒールの新しいタイプのスペースであるため、malloc関数がvoid *の値を返し、転送が使用されて強くなければならない、それは、新しい必要はありません
  5. アプリケーション空間のmallocが失敗した場合、戻り値がNULLのとき、空、彼らは判断を使用する必要があり、キャッチ例外に新しいが、新しいニーズを必要としません。
  6. リリースはデストラクタを呼び出す前にスペースを削除し、malloc関数は、/スペースを開放するだけで自由に、コンストラクタとデストラクタをカスタム型のオブジェクトを呼び出すことはありません適用し、新しいスペースが完成されたオブジェクトを初期化するコンストラクタを適用するときに呼び出されますクリーンアップの完全な宇宙資源

4、new/delete和new[]/delete[]

T新しい新しい:
1、*オペレータ新しい新規呼ボイド(size_tのサイズ)
{
mallocのサイクルアプリケーション---->アプリケーションが成功し、直接リターン
アプリケーションに失敗しました-対策(ユーザ)を提供するために十分なスペースを
提供する:サイクルアプリケーションが
提供されない:例外
}
図2に示すように、初期化制御を完了するためにTのコンストラクタを呼び出します

削除:
。1、Tデストラクタコールリソース解放は、オブジェクト
2は、空オペレータは、自由空間オブジェクトに()を削除します

新しい新しいT [N]:
1、宇宙用途:ボイド*オペレータ新しい新[](size_tのサイズ) - >ボイド*演算子
新しい新しい(size_tのサイズ) - malloc関数のアプリケーションの使用>サイクル
2、Nの構成は、オブジェクト:Nコンストラクタを呼び出すと、オブジェクトを初期化します

削除[]
。1、Nオブジェクトリソースの解放:呼び出しN回デストラクタ
2、Nのスペースを解放するには、オブジェクト:無効delete演算子[](無効 * P) - Delete>を無効演算子(void *型のP) - > 自由な

新しい表現配置スペースがT(パラメータ)new§初期化既存:
1、*オペレータ新しいコールボイド(size_tのサイズ、ボイド*)
{
戻り、アプリケーションが実空間を必要としない、空間直接戻る
}
2 、タイプTのコンストラクタを呼び出します

第二に、テンプレート

1.テンプレートとは何ですか?ジェネリックプログラミングとは何ですか?
テンプレート:あり、コンパイラは、金型内のコードを生成します。テンプレート関数テンプレートおよびクラステンプレートに分かれています。
ジェネリックプログラミング:タイプに関係なく、一般的なコードを書くには、コードの再利用の手段です。テンプレートは、ジェネリックプログラミングの基本です。
2、関数テンプレートのインスタンス化

A>暗黙的にインスタンス化

関数テンプレートのユーザーがインスタンス化されていることをコンパイラ検出された場合:
1、プロジェクト内で検索する-治療の追加機能の特定のタイプがあるかどうかを
見つけるために:直接呼び出しは、テンプレートを生成する必要はありません
が見つかりませんさらに2
プロジェクトで見て2 -かどうかタイプのテンプレート関数の存在を追加し
た:
、控除引数タイプ
B、テンプレートバインディング、関数発生プロセスの特定のタイプ
Cは、プロセスが機能し、特定の種類の生成呼び出し
見つかりません:コンパイルが失敗しました

テンプレートの例で暗黙的ではなく、暗黙的型変換中

B>の例を示しています

それは明らかにTを具体化したテンプレートの種類に対応し、明示的にインスタンス化された場合、コンパイラが直接生成<>コードを入力するに従って、パラメータの型推論である必要はありません。
注:引数の型は、<>の型が一致しないとき場合、コンパイラは暗黙の型変換することも
、コード生成、コンパイル:成功した変換
の変換に失敗:エラー

3、クラステンプレートの特殊

1>コンセプト:テンプレート型パラメータの場合、特別な処理(最も可能性の高いケーステンプレートが正常に処理することができますが、治療のいくつかのタイプのために、おそらく間違いである)ことを

2>専門分類

  • 完全な専門:コンクリートのすべての種類のテンプレートパラメータリスト
template<class T1, class T2>
class Data
{
public:
Data() {cout<<"Data<T1, T2>" <<endl;}
private:
T1 _d1;
T2 _d2;
};

template<>
class Data<int, char>
{
public:
Data() {cout<<"Data<int, char>" <<endl;}
private:
T1 _d1;
T2 _d2;
};
  • 専門分野
    1.一部の専門:パラメータの特定のいくつかのテンプレートパラメータリスト
template<class T1, class T2>
class Data
{
public:
Data() {cout<<"Data<T1, T2>" <<endl;}
private:
T1 _d1;
T2 _d2;
};

// 将第二个参数特化为int
template <class T1>
class Data<T1, int>
{
public:
Data() {cout<<"Data<T1, int>" <<endl;}
private:
T1 _d1;
int _d2;
};

2.型テンプレートパラメータリストにしてみましょう制限がより厳しいです

//两个参数偏特化为指针类型
template <typename T1, typename T2>
class Data <T1*, T2*>
{
public:
Data() {cout<<"Data<T1*, T2*>" <<endl;}
private:
T1 _d1;
T2 _d2;
}

抽出の種類-の実装
原則:アプリケーションのクラステンプレートの特殊化は、コードの運転効率向上させる唯一の手段であることを
6分割コンパイル
、それは分割コンパイル感じるもの1>?
プロジェクトを、複数のソースがあるかもしれませんファイル、すべてのソースファイルを別々にコンパイルされ、ヘッダファイルは(前処理段階ですでに展示建)をコンパイルするには関与しない
2>適切に実行するプログラムを終了するには、これらの段階を経る必要があります。事前にコンパイラ、アセンブラ、リンカ
ここに画像を挿入説明

  • (これらの前処理)前処理
    1、マクロ置換
    2、含むヘッダ
    3は、条件付きコンパイルの選択
  • (コンパイル)をコンパイルすると
    、対応するアセンブリコード.Sを形成するために、完成したファイル字句解析、構文解析、意味解析と最適化を前処理しました。
  • アセンブラ(アセンブル)
    コンパイルされたマシンコードをアセンブラコードに変換し、ターゲットプログラムの.oの再配置可能なオブジェクトファイルを生成します。
  • リンク(リンク)
    リンクを一緒オブジェクトファイルとライブラリファイルへリンカldによって、最終的に実行可能ファイル(実行ファイル)を生成します。

テンプレートの7、長所と短所

  • 利点

    図1に示すように、リソース保存テンプレートコードの再利用、高速反復開発、C ++標準テンプレートライブラリ(STL)、したがって、製造
    2を、コードの柔軟性を向上させます

  • 欠陥

  1. テンプレートコードの膨張は、問題を引き起こす可能性が長く、コンパイル時につながることができます
  2. テンプレートのコンパイルエラー、エラーメッセージは、エラーを見つけることは非常に厄介で難しいです

第三に、OJライン入力と出力

出力:件名慎重出力要件を見て
入力:OJアルゴリズム:IOタイプとインターフェイスタイプOJ OJ
インタフェースタイプOJ:アルゴリズムとのインターフェイスは、符号化するためにのみ、直接、利用されている
OJのIOタイプ:テストケースを受け入れるように、ユーザが必要とする-いくつかの循環を入力する
2つの方法で
ケース1:三つの形状入力:しばらく(CIN >> B >> C){...}
ケース2:全入力ライン:ワード線、複数の最長の長さを見つけるためにワード一方(のgetline(CIN、S) )

第四に、継承

1.コンセプト

  • 継承は、コードの再利用を向上させることができます
  • クラスの本来の特性を維持しながら、展開
  • 階層を反映

2.継承権限
パブリック、保護、民間の
ここに画像を挿入説明
三つの異なる継承:アクセスまたは可視性のサブクラスで基底クラスの異なるアクセス権のメンバー
デフォルト継承されたアクセス許可:クラス・プライベートstruct->公共

3. ----割り当てルールは、パブリック継承と適合しなければならない
継承が公開されている場合-ベースクラスおよびサブクラスは、オブジェクトとして、ベースクラスのサブクラスを見ることができ、
使用:ときに、外部クラス、全て基底クラスの使用の位置は、場所に使わサブクラスのオブジェクトにすることができます

、直接オブジェクト・クラス・オブジェクトではなく、その逆派生グループに割り当てることができる
Bを、基底クラスへのポインタまたは参照を可能にするサブクラスオブジェクト、およびその逆が、変換のタイプ(問題を強制することができる:セキュリティがあってもよいが問題)

4.スコープを継承
異なる基底クラスと範囲に属するサブクラス。どのようなサブクラスのメンバーで民間の継承、基底クラスは表示されません
同じ名前に隠さ持つ:優先順位、基底クラスと派生クラスで同じ名前のアクセスメンバーにするとき、サブクラスのオブジェクトと同じ名前のメンバーがあるかもしれません自分自身の派生クラスへのアクセス

隠された同名
メンバ変数:長いベースと同様、派生クラスのメンバ変数名は、のタイプの同じかかわらず、ある
メンバ関数:限り基本クラスと派生クラスのメンバ関数と同じ名前として、関数プロトタイプの同じかかわらずです

  • 注:派生クラステスト()、テスト(INT)、二つの機能は過負荷、理由を機能されない:範囲は同じではありません
  • 派生クラスは、同じ名前のベースクラスの直接アクセスメンバーはできません、あなたがアクセスを主張する場合は、B ::テスト();使用することは非常に便利ではないか、Bを追加することを忘れかもしれません::、多少の誤差が生じ
  • 推奨しない:例外は、部材ベースと同じ名前で発生したとクラスの派生:ポリモーフィズムを

5.継承階層:建設のルール

  • 1>基底クラスは、派生クラスのコンストラクタができるかどうか、コンストラクタを定義していない場合
  • 基底クラスのコンストラクタは、デフォルトコンストラクタ(フルデフォルトコンストラクタで引数なし||とコンストラクタ)であれば2>、派生クラスのコンストラクタのリリースを提供することができる
    。この時点で:コンパイラは、派生クラスでありますデフォルトコンストラクタ(引数なし)を生成し、派生クラスのコンストラクタで明示的に呼ばれる基底クラスのコンストラクタは、ベース部のメンバーのリストが初期化を完了した初期化
  • 基底クラスがデフォルト以外のコンストラクタ(パラメータで、このコンストラクタ)がある場合3>。この時、明示的に派生クラスは、独自のコンストラクタを提供しなければならない、と明示的に基底クラスのコンストラクタは、リスト内での位置を初期化呼び出す必要がありますコンストラクタ。
class B
{
      public: B(int a){}
};


//没有显式定义构造函数,一定编译出错
class D:public B{};
//原因
//1.如果一个类没有显式定义自己的构造函数,编译器将会生成一个默认的无参构造函数
//2.编译器必须要在派生类构造函数初始化列表显式调用基类的构造函数---问题:基类的构造函数具有参数,派生列在调用时必须要传参,但是编译器不知道应该传递什么参数而导致无法调用而引起编译失败


class D:public B
{
public D(int){} // 没有显式调用基类的构造函数
}//在基类中无法找到无参的构造函数而引起编译失败


//正确写法:
class D : public B
{
   public: D(int b): B(b){}
}
  • 4>継承階層:ときに派生オブジェクトのコンストラクタとデストラクタ-コンストラクタとデストラクタ順序
    関数呼び出し順序:C() - >初期化リストここコールA()、および実行完了- >実行派生クラスのコンストラクタ関数本体()
    印刷:印刷は、Aを(行く)----> Cの印刷()
class A
{
   public:
       A(){}
       ~A(){}
};

class C:public A
{
    public:
       C():A(){}
       ~C(){}
};

void TestFunc()
{
    C d;
   //创建那个类的对象,编译器就会调用那个类的构造函数  
   //析构那个类的对象,编译器就会调用那个类的析构函数
}
公開された22元の記事 ウォン称賛13 ビュー1269

おすすめ

転載: blog.csdn.net/An_Mo/article/details/104286630