ホームページ  >  記事  >  バックエンド開発  >  技術的な回答 オブジェクト指向の予備的な理解 (C++ クラス)

技術的な回答 オブジェクト指向の予備的な理解 (C++ クラス)

php是最好的语言
php是最好的语言オリジナル
2018-07-23 15:58:401489ブラウズ

C には 2 種類のメンバー データ (static、nostatic) と 3 種類のメンバー関数 (static、nostatic、virtual) があることを知っておく必要があります。実際、通常のメンバー関数の場合、パラメーターに this ポインターが含まれています。このポインタは、実際には、このポインタを通じてオブジェクト自体を指します。 C コンパイラは、どのオブジェクトがクラスのメンバー関数を呼び出すかを認識します。

C クラス オブジェクトのメンバー変数とメンバー関数は一緒に格納されていますか?そうでなければ?

C には、static、nostatic という 2 種類のメンバー データと、static、nostatic、virtual という 3 種類のメンバー関数があることを知っておく必要があります。
このケースを以下で見てください:

class A
{    int a;    int b;
};class B
{    int a;    int b;    static int c;
};class C
{    int a;    int b;    static int c;public:    void func() {}    static void pg() {}
};int main()
{    //1. 分析A对象占的内存
    A a;    cout << sizeof(a) << endl;  //结果是8

    //2. 分析B对象占的内存
    B b;    cout << sizeof(b) << endl;  //结果是8

    //3. 分析C对象占的内存
    C c;    cout << sizeof(c) << endl;  //结果是8

    return 0;
}

実際、出力結果に基づいて、次の結論を導き出します:
a. メンバー変数:

  • # #通常のメンバー変数はオブジェクトに格納され、strutc 変数と同じメモリ レイアウトとバイト アライメントを持ちます。

  • #静的メンバー変数はグローバル データ領域に格納されます

b. メンバー関数はコード セグメントに格納されます。

#C コンパイラはクラスとオブジェクトをどのように管理しますか?具体的には、オブジェクトはクラス内のメソッドを呼び出します。C コンパイラはどの特定のオブジェクトがどのメンバー メソッドを呼び出すかをどのように区別しますか?

実際、通常のメンバー関数 (静的メンバー関数ではない) の場合、パラメーターに this ポインターがあります。このポインタは、実際には、このポインタを通じてオブジェクト自体を指します。 C コンパイラは、どのオブジェクトがクラスのメンバー関数を呼び出すかを認識します。 技術的な回答 オブジェクト指向の予備的な理解 (C++ クラス)

要約しましょう:
a. クラス C オブジェクトのメンバー変数とメンバー関数は別々に保存されます;

b. クラス C の通常のメンバー関数 (コンストラクターを含みますが、静的メンバーを除く)関数) はすべて、現在のオブジェクトを指す this ポインターを含みます;
c. 静的メンバー関数と静的メンバー変数はクラスに属します;
d. 静的メンバー関数と通常のメンバー関数の違い:
静的メンバー関数には特定のオブジェクトを指す this ポインターが含まれませんが、通常のメンバー関数には特定のオブジェクトを指すポインターが含まれます。

記事の概要

次の問題を解決する必要があります:

a. クラス C オブジェクトのメンバー変数とメンバー関数は一緒に格納されていますか?そうでなければ?

b. C コンパイラはクラスとオブジェクトをどのように管理しますか?具体的には、オブジェクトはクラス内のメソッドを呼び出します。C コンパイラはどの特定のオブジェクトがどのメンバー メソッドを呼び出すかをどのように区別しますか?

メンバーはメンバーですクラス C オブジェクト内の変数とメンバー関数は一緒に保存されますか?そうでなければ?

C には、static、nostatic という 2 種類のメンバー データと、static、nostatic、virtual という 3 種類のメンバー関数があることを知っておく必要があります。

このケースを以下で見てください:

class A
{    int a;    int b;
};class B
{    int a;    int b;    static int c;
};class C
{    int a;    int b;    static int c;public:    void func() {}    static void pg() {}
};int main()
{    //1. 分析A对象占的内存
    A a;    cout << sizeof(a) << endl;  //结果是8

    //2. 分析B对象占的内存
    B b;    cout << sizeof(b) << endl;  //结果是8

    //3. 分析C对象占的内存
    C c;    cout << sizeof(c) << endl;  //结果是8

    return 0;
}

実際、出力結果に基づいて、次の結論を導き出します:

a. メンバー変数:


# #通常のメンバー変数はオブジェクトに格納され、strutc 変数と同じメモリ レイアウトとバイト アライメントを持ちます。
  • #静的メンバー変数はグローバル データ領域に格納されます
  • b. メンバー関数はコード セグメントに格納されます。
#C コンパイラはクラスとオブジェクトをどのように管理しますか?具体的には、オブジェクトはクラス内のメソッドを呼び出します。C コンパイラはどの特定のオブジェクトがどのメンバー メソッドを呼び出すかをどのように区別しますか?


実際、通常のメンバー関数 (静的メンバー関数ではない) の場合、パラメーターに this ポインターがあります。このポインタは、実際には、このポインタを通じてオブジェクト自体を指します。 C コンパイラは、どのオブジェクトがクラスのメンバー関数を呼び出すかを認識します。

技術的な回答 オブジェクト指向の予備的な理解 (C++ クラス) 要約しましょう:
a. クラス C オブジェクトのメンバー変数とメンバー関数は別々に保存されます;

b. クラス C の通常のメンバー関数 (コンストラクターを含みますが、静的メンバーを除く)関数) はすべて、現在のオブジェクトを指す this ポインターを含みます;
c. 静的メンバー関数と静的メンバー変数はクラスに属します;

d. 静的メンバー関数と通常のメンバー関数の違い:
静的メンバー関数には特定のオブジェクトを指す this ポインターが含まれませんが、通常のメンバー関数には特定のオブジェクトを指すポインターが含まれます。

関連する推奨事項:

Php オブジェクト指向抽象クラス

PHP オブジェクト指向プログラミングの詳細な説明: クラスとオブジェクト_PHP チュートリアル

以上が技術的な回答 オブジェクト指向の予備的な理解 (C++ クラス)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。