ホームページ  >  記事  >  バックエンド開発  >  C++の基礎知識を学ぶ - このポインタ、静的メンバ、定数メンバ関数

C++の基礎知識を学ぶ - このポインタ、静的メンバ、定数メンバ関数

php是最好的语言
php是最好的语言オリジナル
2018-08-08 11:29:501957ブラウズ

1. このポインター

1. C プログラムから C プログラムへの変換

class CCar {                          struct CCar {
    public:                                int price;
    int price;                        };
    void SetPrice(int p);             void SetPrice(struct CCar * this,int p){
};                                        this->price = p;
void CCar::SetPrice(int p){           }
    price = p; //this->price = p;
}                                     int main() {
int main(){                               struct CCar car;
    CCar car;                             SetPrice( & car,20000);
    car.SetPrice(20000);                  return 0;
    return 0;                         }
}

2. このポインターの機能: 非静的メンバー関数で直接使用できます。ポインタを表す この関数が動作するオブジェクトへのポインタ

#3、このポインタと静的メンバー関数: 静的メンバー関数は特定のオブジェクトに対して特に動作しないため、このポインタを静的メンバーで使用することはできませんfunction

2 、静的メンバー

  • 静的メンバー: 説明の前に static キーワードが付いているメンバー。

  • 通常のメンバー変数にはオブジェクトごとに独自のコピーがありますが、静的メンバー変数には合計で 1 つのコピーしかなく、すべてのオブジェクトで共有されます。sizeof 演算子は静的メンバー変数を計算しません。

  • 通常のメンバー関数はオブジェクトに対して特に動作する必要がありますが、静的メンバー関数はオブジェクトに対して特に動作せず、オブジェクトを渡さずにアクセスできます。

  • class CRectangle{
        private:
            int w, h;
            static int nTotalArea; // 静态成员变量
        public:
            CRectangle(int w_,int h_);
            ~CRectangle();
            static void PrintTotal(); // 静态成员函数
    };
1. 静的メンバーにアクセスするメソッド:

  • クラス名::メンバー名 CRectangle::PrintTotal();

  • オブジェクト名.メンバー名 CRectangle r; r.PrintTotal();

  • #Pointer->メンバー名 CRectangle * p = &r; p->gt; PrintTotal();
  • Reference.Member name CRectangle & ref = r; int n = ref.nTotalNumber;
  • 2. 注:

    静的メンバー変数は本質的にグローバル変数です。オブジェクトが存在しない場合でも、クラスの静的メンバー変数は依然として存在します
  • 定義済み 静的メンバー変数は、クラス ファイル内で 1 回記述または初期化されます。それ以外の場合、コンパイルは成功しますが、リンクは失敗します。
  • 静的メンバー関数では、非静的メンバー変数にアクセスできず、非静的メンバー関数を呼び出すこともできません
  • 3. メンバー オブジェクトと囲まれたクラス

1. 定義: メンバー オブジェクトを持つクラスは、囲みクラスと呼ばれます

class CTyre{             // 轮胎类
    private:
        int radius;      // 半径
        int width;       // 宽度
    public:
        CTyre(int r,int w):radius(r),width(w) { }
};
class CEngine{           // 引擎类
};
class CCar {             // 汽车类
    private:
        int price;       // 价格
        CTyre tyre;
        CEngine engine;
    public:
        CCar(int p,int tr,int tw );
};
CCar::CCar(int p,int tr,int w):price(p),tyre(tr, w){};
int main(){
    CCar car(20000,17,225);
    return 0;
}

上記の例では、 CCar クラスがコンストラクターを定義していない場合、次のステートメントはコンパイル エラーを引き起こします: CCar car; コンパイラは car.tyre がどのように初期化されるべきかを理解していないためです。 car.engine の初期化には問題はありません。デフォルトのコンストラクターを使用するだけです。閉じたクラス オブジェクトを生成するステートメントでは、オブジェクト内のメンバー オブジェクトがどのように初期化されるかをコンパイラーに理解させる必要があります。具体的な方法は、閉じたクラスのコンストラクターの初期化リストを使用することです。

2. クローズド クラスのコンストラクターとデストラクターの実行順序

    クローズド クラス オブジェクトが生成されると、すべてのオブジェクト メンバーのコンストラクターが最初に実行され、次にクロージャが実行されます。クラスコンストラクター。
  • オブジェクト メンバーのコンストラクター呼び出し順序は、メンバー初期化リストに表示される順序に関係なく、オブジェクト メンバーがクラス内で記述される順序と一致します。
  • クローズド クラスのオブジェクトが終了すると、最初にクローズド クラスのデストラクタが実行され、次にメンバ オブジェクトのデストラクタが実行されます。この順序は、コンストラクターの呼び出し順序とは逆になります。
  • class CTyre {
        public:
            CTyre() { cout << "CTyre contructor" << endl; }
            ~CTyre() { cout << "CTyre destructor" << endl; }
    };
    class CEngine {
        public:
            CEngine() { cout << "CEngine contructor" << endl; }
            ~CEngine() { cout << "CEngine destructor" << endl; }
    };
    class CCar {
        private:
            CEngine engine;
            CTyre tyre;
        public:
            CCar( ) { cout << “CCar contructor” << endl; }
            ~CCar() { cout << "CCar destructor" << endl; }
    };
    int main(){
        CCar car;
        return 0;
    }
    //输出结果:
    CEngine contructor
    CTyre contructor
    CCar contructor
    CCar destructor
    CTyre destructor
    CEngine destructor
  • 4. フレンド

1. フレンドはフレンド機能とフレンドクラスの 2 種類に分類されます

(1) フレンド機能: フレンドクラスの関数はクラスのプライベート メンバーにアクセスできます

class CCar ;     //提前声明 CCar 类,以便后面的CDriver 类使用
class CDriver{
    public:
    void ModifyCar( CCar * pCar) ;         // 改装汽车
};
class CCar{
    private:
        int price;
        friend int MostExpensiveCar( CCar cars[], int total); // 声明友元
        friend void CDriver::ModifyCar(CCar * pCar);     // 声明友元,可包括构造、析构函数
};
void CDriver::ModifyCar( CCar * pCar){
    pCar->price += 1000;                        // 汽车改装后价值增加
}
int MostExpensiveCar( CCar cars[],int total){   // 求最贵汽车的价格                           
    int tmpMax = -1;
    for( int i = 0;i < total; ++i )
    if( cars[i].price > tmpMax)
    tmpMax = cars[i].price;
    return tmpMax;
}

(2) フレンド クラス: A が B のフレンド クラスの場合、A のメンバー関数は B のプライベート メンバーにアクセスできます。メンバーおよびフレンド クラスは転送または継承できません

class B{
    friend class A;      // 声明A为友元类
};

5. 定数メンバー関数

1. 機能: オブジェクトの値を変更したくない場合は、オブジェクトの値を変更したくない場合は、オブジェクトの場合、オブジェクトの前に const キーワード

    を追加できます。クラスのメンバー関数の記述の後に const キーワードを追加すると、メンバー関数は定数メンバー関数になります。 。
  • 属性の値は定数メンバー関数内で変更することはできません。また、非定数メンバー関数を呼び出すこともできません。
  • Before定数メンバー関数の定義と定数メンバーの宣言 const キーワードはすべての関数で使用する必要があります
  • class Sample {
        private :
            int value;
        public:
            Sample() { }
            void SetValue() {  }
    };
    const Sample Obj;  //  常量对象
    Obj.SetValue ();   //错误,常量对象只能使用构造函数、析构函数和有const说明的函数(常量方法)
  • 2. 定数メンバー関数のオーバーロード: 2 つの関数は同じ名前とパラメーター リストを持ちます。オーバーロード

3. 可変メンバー変数:

(1) 機能: mutable は const の制約を超えて設定されます。mutable によって変更された変数は常に変数状態でも、const 関数でも。

(2) 応用: クラスのメンバ関数がオブジェクトの状態を変更しない場合、通常は const として宣言されます。ただし、クラスの状態と関係のない一部のデータ メンバーを const 関数で変更する必要がある場合は、これらのデータ メンバーを mutable で変更する必要があります。

class CTest{
    public:
        bool GetData() const{
            m_n1++;
            return m_b2;
        }
    private:
        mutable int m_n1;
        bool m_b2;
};

関連する推奨事項:

C 静的メンバーと定数メンバーの使用

C 検討ポイントの要約 5 静的メンバー変数とメンバー機能

#

以上がC++の基礎知識を学ぶ - このポインタ、静的メンバ、定数メンバ関数の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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