C++-静的メンバーとthisポインタ

3742 ワード

目次
  • 一、静的メンバー
  • 1.1静的データ・メンバー
  • 1.2静的メンバー関数
  • 二、thisポインタ
  • 一、静的メンバー
    1.1静的データ・メンバー
    特定のクラスオブジェクトの静的データメンバーの役割ドメインや初期化用キーワードstatic宣言ではなく、クラスのインスタンスによって共有されます.
  • はpublic,private,protected
  • と宣言することができる.
  • クラスのデータメンバーが静的であることを宣言すると、静的メンバーには、クラスのオブジェクトがいくつ作成されても1つのコピー
  • しかありません.
  • はクラスのすべてのオブジェクトで共有され、静的生存期間
  • を有する.
  • 基本データ型の静的データメンバーのデフォルトは、
  • に初期化されます.
  • クラス内宣言、クラス外定義および初期化、および範囲解析演算子(:)を使用して、属するクラスを指定します.int,enumタイプのconst staticデータメンバーは、クラス定義で宣言されたときに
  • を初期化することができる.
  • デフォルトコンストラクション関数を持つクラスタイプの静的データメンバー(すなわち静的メンバーオブジェクト)は、初期化する必要はなく、
  • が呼び出されるデフォルトコンストラクション関数である.
    静的データ・メンバーへのアクセスは、通常、クラスの静的メンバー関数またはクラスの友元を介してクラスのprivateにアクセスします.protected静的メンバークラスにオブジェクトがない場合
  • public静的データ・メンバーにアクセスするには、メンバー名にクラス名と二元役割ドメイン演算子(:)
  • を付ける必要があります.
  • private,protected静的データ・メンバーにアクセスするにはpublic静的メンバー関数を指定し、関数名にクラス名と二元作用ドメイン演算子(:)を付けることで関数
  • を呼び出す必要があります.
    1.2静的メンバー関数
    メンバー関数を静的に宣言すると、クラスの特定のオブジェクトとは独立して関数を開くことができます.
  • クラスオブジェクトが存在しない場合でも呼び出すことができ、クラス名と範囲解析演算子:を使用して
  • にアクセスできます.
  • 静的メンバー関数は、静的メンバーデータ、他の静的メンバー関数、およびクラス外部の他の関数
  • にのみアクセスできます.
  • 静的メンバー関数にはクラス範囲があり、クラスのthisポインタにアクセスできません.静的メンバー関数を使用して、クラスの一部のオブジェクトが作成されたかどうかを判断できます.
  • 静的メンバー関数で非静的メンバーにアクセスするには、オブジェクト
  • を通過する必要があります.
    #include 
    using namespace std;
     
    class Box {
    public:
        static int count;    //         private    ,             
        Box(double l, double b, double h);
        double Volume();
        static int getCount();
    private:
        double length, width, height;
    };
     
    int Box::count = 0;
    Box::Box(double l = 2.0, double b = 2.0, double h = 2.0) {
        cout <

    注意:静的メンバー関数と一般的なメンバー関数の違い
  • 静的メンバー関数thisポインタがない場合、静的メンバー(静的メンバー変数と静的メンバー関数を含む)
  • にのみアクセスできます.
  • 一般メンバー関数にはthisポインタがあり、クラス内の任意のメンバーにアクセスできます.静的メンバー関数にはthisポインタ
  • はありません
    静的メンバーを使用して、構造関数と構造関数の呼び出し状況を理解する
    #include 
    using namespace std;
     
    class Cpoint {
    public:
        static int value;
        static int num;
        Cpoint(int x,int y) {
            xp = x, yp = y;
            value++;
            cout << "    :" << value << endl;
        }
        ~Cpoint() { num++; cout << "    :" << num << endl; }
    private:
        int xp, yp;
    };
    class CRect {
    public:
        CRect(int x1,int x2) : mpt1(x1,x2), mpt2(x1,x2) { cout << "    
    "; } ~CRect() { cout << "
    "; } private: Cpoint mpt1, mpt2; }; int Cpoint::value=0; int Cpoint::num=0; int main() { CRect p(10,20); cout << "Hello, world!" << endl; return 0; } : :1 :2 Hello, world! :1 :2

    二、thisポインタ
    各オブジェクトはthisというポインタで自分のアドレスにアクセスできます.
  • オブジェクトのポインタはオブジェクト自体の一部ではない、すなわちthisが占めるメモリはオブジェクトをsizeof操作した結果に
  • を表すことはない.
  • thisポインタは、暗黙的な実パラメータとしてオブジェクトに渡される非staticメンバー関数
  • である.
  • staticメンバー関数にはthisポインタはありません.staticデータメンバーとstaticメンバー関数はクラスの任意のオブジェクトとは独立して存在し、thisポインタは特定のクラスオブジェクト
  • を指す必要があります.
  • thisポインタのタイプは、オブジェクトのタイプとthisポインタを使用するメンバー関数がconst
  • として宣言されているかどうかによって異なります.
  • thisポインタは、オブジェクトが自分に与える
  • の値を防止することができる.
    #include
    using namespace std;
     
    class Test {
    public:
        Test(int = 0);
        void print();
    private:
        int x;
    };
     
    Test::Test(int value) : x(value) { }
    void Test::print() {
        cout << "\tx = " << x
        << "
    this -> x = " << this -> x << "
    (*this).x = " << (*this).x << endl; } int main() { Test test(20); test.print(); return 0; } : x = 20 this -> x = 20 (*this).x = 20

    転載先:https://www.cnblogs.com/xxwang1018/p/11546664.html