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、このポインタと静的メンバー関数: 静的メンバー関数は特定のオブジェクトに対して特に動作しないため、このポインタを静的メンバーで使用することはできませんfunction2 、静的メンバーclass CRectangle{ private: int w, h; static int nTotalArea; // 静态成员变量 public: CRectangle(int w_,int h_); ~CRectangle(); static void PrintTotal(); // 静态成员函数 };
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
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 キーワード
class Sample { private : int value; public: Sample() { } void SetValue() { } }; const Sample Obj; // 常量对象 Obj.SetValue (); //错误,常量对象只能使用构造函数、析构函数和有const说明的函数(常量方法)
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 サイトの他の関連記事を参照してください。