クラスとオブジェクトを理解します

クラスとオブジェクト

Cはオブジェクト指向、物事は別のオブジェクトに分割関心の対象となる手続き型言語のフォーカスプロセス指向、C ++言語であり、オブジェクトが相互作用することによって達成されます。

クラスとオブジェクトの初期の理解

1クラスの導入
構造前クラスクラスキーワード抽出は、構造が(OH関数で定義されていてもよいC ++構造体)クラス1aに定義することができ、インビボ関数で関数を定義することができることを除いて、同様である
2クラス定義する
二つの定義のファッションのクラスのメンバ関数を:あなたは、クラス定義を定義することができますが、コンパイラは、第二をお勧めします、それを処理するためのインライン関数として扱われる可能性がある-関数の宣言と定義を分離します。
3.クラスアクセス修飾
プライベート、パブリック、保護は、--->保護およびプライベート変更されたオブジェクトを直接クラス外でアクセスすることができない
クラスのクラスのデフォルトはプライベートで、構造体は、デフォルトによって公開されている
オブジェクト指向の三つの特徴:カプセル化、継承、我々は、パッケージの定義について話状態、:データのデータとメソッドが操作を組み合わせて、隠されたオブジェクトのプロパティと実装の詳細、唯一の公的インタフェースとオブジェクトと対話します。
4.クラススコープの
クラスは、スコープ修飾子::訪問を使用するアクセスクラスのメンバーに、新しいスコープを定義します。
スコープの関数、クラス、名前空間内のローカルグローバルスコープ、:ここでは、4つのスコープを連絡しました。
(ターゲット)としてクラス5
クラスは、クラスのメンバーのみ実メモリ空間とクラスオブジェクトを作成、全くオープンスペースではない定義します。
ここでは、そのクラスの大きさを計算する方法、問題を考える必要がありますか?クラスのメンバ関数は、どのように我々がすべき、含めることができますか?
私たちは、クラスの大きさは、実際にクラスのメンバ変数のサイズで知ることができますテストすることによって、クラスのメンバ関数は、メモリアライメントの問題に注意を払う、公共エリアコードに配置されています。オブジェクトを作成するときが区別されなければならないので、このクラスは、1であるものの、それは空のクラス、またはクラスのメンバ関数である場合にのみ、そのサイズ。
6.thisポインタ
現在のオブジェクト(関数呼び出し関数のオブジェクトが実行されている)へのポインタは、すべてのメンバ変数の操作は、関数本体へのポインタを介してアクセスされるように、各メンバ関数のためのC ++では、デフォルトパラメータへのポインタを追加します。しかし、すべての操作は、ユーザーが自動的に、コンパイラを渡す必要はありませんつまり、ユーザーに対して透過的です。なぜ我々はこれを行うために、正確にその身体を呼び出すためにアクセスするためにようこそ、この関数ポインタの存在を、質量参加時にユーザー自身の着信アドレスに相当します。

  • このポインタの特徴
  • このポインタ型:Classタイプ*それへのconst、このポインタは、ポイントは変更されません。
  • オブジェクトは、このポインタを格納しないように関数ポインタとしてこのパラメータは、関数呼び出しは、このパラメータオブジェクトのアドレスに渡されます

    II。のクラスのデフォルトコンストラクタ関数

    クラス定義が何もないではありませんこれは、それが自動的に6つのデフォルトの関数が生成されます良いです
    1.コンストラクタ
    コンストラクタは、それをしているのですか?
    コンストラクタは、コンパイラによって自動的に型のオブジェクトは、各データメンバは、適切な初期値を有し、オブジェクトの存続期間中に1回だけ呼び出されることを保証するために、場合と呼ばれるクラスを作成し、クラス名と同じ名前の特別なメンバー関数です。ことを特徴としている完了したことをコンストラクタオブジェクトの初期化、:クラス名と同じ関数名、ノーリターン値は、コンパイラが自動的に対応するコンストラクタがインスタンス化されるオブジェクトを呼び出し、コンストラクタはオーバーロードすることができます。システムは自動的に引数なしのコンストラクタは、もちろん、我々は、我々は、次のコードを見て、直接オブジェクト時間の定義で初期化引くことができ、パラメータを持つコンストラクタを書くことができます生成します。
    class data<br/>{<br/>public:<br/>data(int year=1999,int month=1,int day=1)<br/>{<br/>_year = year;<br/>_month = month;<br/>_day = day;<br/>}<br/>private:<br/>int _year;<br/>int _month;<br/>int _day;<br/>};

さて、この場所で、私たちは、あなたが直接それを行うことができ、オブジェクトを初期化するコンストラクタを作成しなければならなかったときにオブジェクトの定義内の主な機能:
データA(1999,10,13)。

だから、それ以外の場合は、関数の宣言となり、我々はシステムがコンストラクタへの参照ではないことを知っているので、我々は、引数なしのコンストラクタ定義された時間()に持参する必要はありません。
上記のコードは、コンパイラがデフォルトコンストラクタを生成しないとき、我々は明示的にその存在を作成したコンストラクタです

もう一つのポイントに注意する:定義されたように、2つのオーバーロードされた関数を構成しないように、引数なしのコンストラクタと、完全なデフォルトコンストラクタは、デフォルト機能として知られていないが、一つだけ、繰り返すことができます許可されています。

それはコンストラクタどのような役割であるのでしょうか? - 可変型がちょうど固定intまたはチャー例えばないので、ユーザ定義型が存在してもよい>、次にコンストラクタは、その役割であるこのカスタム型メンバ関数を呼び出します。

2。初期値コンストラクタ
プロセス上記の動作初期化コンストラクタ本体ではありませんが、我々はコンストラクタ初期化リストで初期化するために使用されています。

初期化リスト:カンマ区切り、括弧内の最初の値または式を有する各「メンバ変数」次のデータメンバーのリストが続くコロン、で始まります。
公共:
データ(int型年= 1999、=月INT 1、INT 1 =日。。)
:_year(年)
、_month(月ザ・)
、_day(日)
{

}

注:1.でも初期化リストなしで自動的に各変数のリストを生成するシステムを初期化するために、一度だけ初期化され、メンバ変数は、CONST修飾参照タイプでない場合されたクラス型のメンバ変数(デフォルトコンストラクタ)これら3例あなたは自動的に初期化する方法を認識しませんシステムを初期化せずにクラス型のメンバ変数のデフォルトコンストラクタがない場合、それを初期化する初期化リストを使用しなければならないとき、それは間違って行くでしょう。

2.初期化シーケンス変数のメンバーが決定のメンバ変数の順序に従って宣言され、順番に関係なく初期化リストの、そして私たちはエラーに非常になりやすい、変数の代入を使用しないように、初期化リストで同じの声明を注文してみてください。

  1. 明示的なキーワード
    興味深い現象でC ++で見つかったが、データa = 100;実際に等号オペランドのタイプの異なる側面をコンパイルすることができますが、この文をコンパイルすることができますので、我々は、このコピー過負荷に呼び出しを見ることができますプロセスは、検査に行ったとき、私たちは、過負荷の際に代入演算子は、最初の100クラスを構築するために、コンストラクタを呼び出し中に見つかりました!したがって、単一のパラメータ(引数)の設定のために設定コンストラクタの役割と変換アクション機能の種類のみならず。
    明示的なコンストラクタを禁止する前にこのタイプの変換を変更することになるとしかし、時には、私たちは、この出来事を望んでいません。


3.staticメンバー

のC ++では、静的変数や関数によって変更静的メンバ変数とメンバ関数は、静的メンバ変数や静的メンバ関数と呼ば変更することができ
、共有のすべてのクラスの変更静的オブジェクトを!

違い:
|静的メンバ変数|通常のメンバ変数|
|クラス外の初期化|クラスの初期化|
| |すべての共有オブジェクト|各オブジェクトには含まれてい
|名::クラスは名前で静的メンバにアクセスすることができます|のみ|オブジェクトアクセスによって
|すべての共有オブジェクト| |各オブジェクトが含まれています

静的メンバ変数は、クラスのサイズには影響しません、つまり、静的メンバーは、クラスの大きさの計算のサイズを計算する必要はありません、彼らは同じメモリ空間を使用しています

|静的メンバー関数|通常のメンバ関数|
|何このポインタ(非静的メンバにアクセスしていない)隠さ|このポインタを有する|
であってもよい| | |(このポインタは、ときに変更constメンバ関数が実際に修正されるように)CONSTは変更することはできません
|オブジェクトを呼び出すことによってすることはできません|オブジェクトを通して呼び出すこと|

唯一の静的メンバ変数にアクセスすることができ、静的メンバ関数の静的な変更で通常のメンバ変数にアクセスすることはできません。
通常のメンバ関数はアクセス可能です。

II。デストラクタ

コンストラクタに対応するデストラクタ機能、およびコンフィギュレーションをオーバーロードコンストラクタ関数、それは関数名であるデストラクタ、デストラクタのために、この関数は何のパラメータと戻り値を持たない〜関数名の前に、クラス名ではありません破壊のクラスオブジェクトが、いくつかのリソースは、クリーンアップのクラスを完了します。オブジェクトは、自動的にライフサイクルの終了時にデストラクタを呼び出します。

III。コピーコンストラクタ

コピーコンストラクタ:単一のパラメータ、パラメータが存在し、クラスタイプ(CONSTが一般的に使用される修飾された)のオブジェクトへの参照であり、自動的にクラスタイプの既存のオブジェクトと新しいオブジェクトを作成する際に、コンパイラによって呼び出されます。

注意:コピー機能は、唯一のパラメータのために、オーバーロードコンストラクタで、コール・バイは無限再帰になる場合は、船への参照でなければなりません。

:その後、私たちは、この関数を定義するオブジェクト内の既存のオブジェクトに新しいオブジェクトを定義することができますが存在する
ような:日付D1、データD2(D1 )。

それが仕事の浅いコピーを完了した場合も同様に、コンパイラは、次のような状況として、私たちのためにデフォルトのコピーコンストラクタを生成しますが、:

class String
{
public:
    String(const char* str = "jack")
    {
        _str = (char*)malloc(strlen(str) + 1);
        strcpy(_str, str);
    }

    ~String()
    {
        cout << "~String()" << endl;
        free(_str);
    }
private:
    char* _str;
};

int main()
{
    String s1("hello");
    String s2(s1);
}

コンストラクタでは、我々は、デフォルトのコピーコンストラクタは同じ、D1私たちが望む結果ではないとd2シェア新しいオブジェクトD2にコピーし、このアドレスにそのままとなりますダイナミックメモリ空間の作成が完了しましたD1 d2が変更されます修正するメモリ空間。これは浅いコピーと呼ばれているので、我々はコンストラクタが暗いコピーをカスタマイズする必要があります。この後半の導入を行うことで。

IV。代入演算子のオーバーロード

私たちは、演算子のオーバーロード何について話をするために大型の話をする前に、代入演算子が必要であり、その後、2つのクラスは同等の大きさではありませんが、我々は演算子のオーバーロードを行う場合は、クラスの大きさに応じても、その後、過負荷に関係比較演算子を使用しています他の演算子は同じです。

オペレータキーワードをオーバーロード算出
演算子オーバーロードの特殊なタイプで、異なるように過負荷++フロントとリア++であります

代入演算子4ポイントがあります。

  1. パラメータタイプ
  2. 返却値
  3. 割り当て自分自身かどうかを検出します
  4. 戻るこれは//連続割り当ての問題を解決するために、戻り値としてこれを
  5. クラスが明示的に代入演算子のオーバーロードで定義されていない場合、コンパイラは、値オブジェクトによって完全なバイト順序がコピーで生成されます。

また、浅いコピーがある完成ので、我々はまた、自身が代入演算子のオーバーロードを実現する必要があります。ディープコピーを達成し、それは言っ背面にもあります。

デフォルトの機能はほとんど自分自身を達成していない、どちらも最後の2つのアドレスの一般的な変数とconstの変数を、取ることです。

IV。フレンド

私たちは、オペレータの出力をオーバーロードした場合、「<<」、それを行う方法
のostream&演算子<<(ostreamに&_coutを )------> このような関数の定義場合、これは、その後、<<オーバーロードされた関数functionであります最初のパラメータとして、その中に含まれるこのポインタ、クラスDは、従来のCOUT <<によれば、このようにして出力できないように出力するように意図された機能を呼び出すために、最初のパラメータは、このポインタの関数であり、呼び出しD << COUTに、通常出力します。
では、どのようにではなく、物事の従来の方法に応じて、オーバーロード<<のこの方法を避けることができます

ここでは、グローバルスコープ定義の通常の順序に従って渡された2つのパラメータのオーバーロード機能を持つことになりますが、あなたは限り、私たちは友人とクラスでこの関数を宣言して、クラスのこのプライベートメンバ関数を参照することはできませんすることはできませんその後、ファンクションキーの変更は、このクラスのフレンド関数は、クラスで訪問されています

注:
関数はメンバ関数である友人は普通のクラスではありません
プライベートメンバフレンド関数がクラスにアクセスすることができますが、クラスのメンバが機能していない
フレンド関数をconstのことで変更することはできません(constが、これはポインタであるため、修正、および友人この機能は、ポインタではありません)
フレンド関数の宣言は、クラスではない修飾子がアクセス、クラス定義の任意の場所に限定することができる
複数のクラスのことができるフレンド関数機能を
フレンド関数の通常の関数と同じ原理通話と通話

また、このクラスは、クラスは、その内部のプライベートメンバーにアクセスしますが、このプロセスは一方通行で、渡すことができないことに注意することができ、別のクラスの友人もできます。

おすすめ

転載: blog.51cto.com/14239789/2439354