私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
目次
クラス定義形式
class はクラスを定義するキーワード、Stack はクラスの名前、{} はクラスの本体です。定義の最後のセミコロンは省略されないことに注意してください。クラス本体の内容はクラスのメンバーと呼ばれます。クラス内の変数はクラスの属性またはメンバー変数と呼ばれ、クラス内の関数はクラスのメソッドまたはメンバー関数と呼ばれます。
- //text.cpp
- #include<iostream>
- using namespace std;
-
- class Stack
- {
-
- //成员变量
- int* a;
- int top;
- int capacity;
- //成员函数
- void Push()
- {
-
- }
- void Pop()
- {
-
- }
- };//分号不能省略
- int main()
- {
-
-
- return 0;
- }
- //为区分成员变量,一般前面加_
- //成员变量
- int* _a;
- int _top;
- int _capacity;
C++ はカプセル化を実装する方法で、クラスを使用してオブジェクトのプロパティとメソッドを組み合わせてオブジェクトをより完全にし、アクセス権を通じてそのインターフェイスを外部ユーザーに選択的に提供します。
- //text.cpp
- #include<iostream>
- using namespace std;
-
- class Stack
- {
-
-
- ///
-
- void Push()
- {
-
- }
- //Push 没给限定符 class默认私有 private
- ///
- public:
- void Pop()
- {
-
- }
- int Swap()
- {
-
- }
- //Pop和Swap 被public修饰,直到下一个限定符出现之前都为公有
- ///
- protected:
- int add();
- //add 被public修饰,直到下一个限定符出现之前都为保护
- /// /
-
- private:
-
- int* _a;
- int _top;
- int _capacity;
- //成员变量被private修饰,直到}结束都为私有
- };
- int main()
- {
- Stack st;
- //公有可以访问
- st.Pop();
- st.Swap();
- //私有不可访问
- st._top;
-
-
-
- return 0;
- }
その他の注意事項:
クラスは新しいスコープを定義します。クラスのすべてのメンバーはクラスのスコープ内にあります。クラス外のメンバーを定義する場合は、メンバーがどのクラス スコープに属するかを示すために使用する必要があります。
クラス ドメインはコンパイルの検索規則に影響します。次のプログラムの Init でクラス ドメイン Stack が指定されていない場合、コンパイラは Init をグローバル関数として扱います。コンパイル中に _top などのメンバーが見つからない場合、コンパイラは Init をグローバル関数として扱います。クラスドメインを使用してそれらを見つけます。
- //text.cpp
- #include<iostream>
- using namespace std;
-
- class Stack
- {
-
-
- public:
- void Init(int x, int y);
-
- };
- void Stack::Init(int x, int y)
-
- {
- _top = x;
- _capacity = y;
- }
- int main()
- {
-
- return 0;
- }
知らせ:
- //text.cpp
- #include<iostream>
- using namespace std;
-
- class Stack
- {
-
- //声明
-
- int* _a;
- int _top;
- int _capacity;
-
- };
-
- int main()
- {
-
- Stack::_top = 2024;
- //编译器报错,_top只是声明,并未实例化
-
- return 0;
- }
-
- //text.cpp
- #include<iostream>
- using namespace std;
-
- class Stack
- {
-
-
- //声明
- int* _a;
- int _top;
- int _capacity;
-
- };
-
- int main()
- {
-
-
- Stack st;
- st._top=2024;
- //Stack实例化出st,系统已经给st分配内存了,可以存储数据,编译通过
-
- return 0;
- }
-
-
メモリアライメントルール
- class A
- {
- public:
- void Print()
- {
- cout << _ch << endl;
- }
- private:
- char _ch;
-
- int _i;
- };
- //_ch 是一个字节,默认对齐数是4,最大对齐数是4,所以开辟4个字节用来存在_ch
- // _i是4个字节,默认对齐数是4,最大对齐数是4,所以开辟4个字节用来存储_i
- class B
- {
- public:
- void Print()
- {
- //。。。
- }
-
-
- };
- class B
- {
-
-
- };
- //B和C里面没有存储任何成员变量,只有一个函数,可成员函数不存对象里面
- // 按理来说是0,但是结构体怎么会没大小,为表示对象存在C++对这种规定大小为1,为了占位标识对象存在
コンパイラーがコンパイルした後、クラスのメンバー関数は、デフォルトで、このポインターと呼ばれる現在のクラスへのポインターを仮パラメーターの最初の位置に追加します。
たとえば、Date クラスの Init プロトタイプは void Init (Date * const this, int year, int month, int day) です。クラスのメンバー関数のメンバー変数にアクセスする場合、本質は this ポインターを介してアクセスされます。 Init 関数の _year、this->_year=year など。
プロトタイプ:
- class Date
- {
- void Print()
- {
-
- cout << _year << "n" << _month << "n" << _day << endl;
- }
- void Init( int year, int month,int day)
- {
- _year = year;
- _month = month;
- _day = day;
-
- }
-
- private:
- int _year;
- int _month;
- int _day;
-
- };
-
- Date d1;
- d1.Init(2024,7,10);
-
- d1.Print();
- Date d2;
-
- d2.Init(2024, 7, 9);
- d2.Print();
-
実際のプロトタイプ
- class Date
- {
- void Init(Date* const this,int year, int month,int day)
-
- {
- this->_year = year;
- this->_month = month;
- this->_day = day;
-
- }
- void Printf(Date* const this)
-
- {
-
- cout << this->_year << "n" <<this-> _month << "n" << this->_day << endl;
- }
- private:
- int _year;
- int _month;
- int _day;
-
- };
- Date d1;
- d1.Init(&d1,2024,7,10);
- d1.Print(&d1);
-
- Date d2;
- d2.Init(&d2,2024, 7, 9);
- d2.Print();
C++ では、このポインタを実パラメータおよび仮パラメータの位置に記述することは許可されていないと規定されています (コンパイル時にコンパイラが処理します)。このポインタは関数本体内で明示的に使用できますが、このポインタは変更できません。このポインタが指すコンテンツは、
このポインタはスタックに保存されます
デフォルトメンバ関数とは、ユーザが明示的に定義せず、コンパイラによって自動的に生成されるメンバ関数のことをデフォルトメンバ関数といいます。
コンストラクターは特別なメンバー関数です。コンストラクターはコンストラクターと呼ばれますが、コンストラクターの主な内容は、オブジェクトを作成するためのスペースを開くことではないことに注意してください (通常使用するローカル オブジェクトは、オブジェクトを作成するときに開かれるスペースです)。スタック フレームは作成されます))、ただし、オブジェクトはインスタンス化時に初期化されます。コンストラクターの本質は、以前に Stack クラスと Date クラスで作成した Init 関数の関数を置き換えることです。コンストラクターの自動呼び出しは、Init 関数を完全に置き換えます。
コンストラクターの特徴:
- class Date
- {public:
- //1.无参构造函数
- Date()
- {
- _year = 1;
- _month = 1;
- _day = 1;
- }
- //2.带参构造函数
- Date(int year, int month, int day)
- {
- _year = year;
- _month = month;
- _day = day;
- }
-
-
- //3.全缺省构造函数
- Date(int year = 1, int month = 1, int day = 1)
- {
- _year = year;
- _month = month;
- _day = day;
- }
- private:
- int _year;
- int _month;
- int _day;
-
- };
パラメーターなしのコンストラクター、すべてデフォルトのコンストラクター、およびコンストラクターを作成しないときにデフォルトでコンパイラーによって生成されるコンストラクターはすべてデフォルト コンストラクターと呼ばれます。ただし、これら 3 つのうち 1 つだけが存在でき、同時に存在することはできません。パラメーターなしのコンストラクターと完全なデフォルトのコンストラクターは関数のオーバーロードを構成しますが、それらを呼び出すときにあいまいさが生じます。デフォルト コンストラクターは、デフォルトでコンパイラーによって生成されるコンストラクターであるだけでなく、パラメーターのないコンストラクターであり、完全なデフォルト コンストラクターも、要約すると、パラメーターを渡さずに呼び出すことができることに注意してください。
デフォルトでは、コンパイラーによって生成される構成体には、組み込み型メンバー変数の初期化の要件はありません。つまり、初期化されるかどうかはコンパイラーに依存します。
- //text.cpp
- #include<iostream>
- using namespace std;
- typedef int STDataType;
- class Stack
- {
- public:
- Stack(int n = 4)
- {
- _a = (STDataType*)malloc(sizeof(STDataType) * n);
- if (nullptr == _a)
- {
- perror("malloc申请失败");
- }
- _capacity = n;
- _top = 0;
- }
-
- private:
- STDataType* _a;
- size_t _capacity;
- size_t _top;
- };
- //两个Stack实现队列
- class MyQueue
- {
- private:
- int size;
- Stack pushst;
- Stack popst;
- };
-
- int main()
- {
-
- MyQueue my;
-
-
- return 0;
- }
-
C++ では、型をカスタム型と組み込み型 (基本型) に分類します。組み込み型は、int/char/double/pointer など、言語によって提供されるネイティブ データ型です。カスタム型は、class/struct などのキーワードを使用して独自に定義する型です。ここのコンストラクターは自動的に初期化され、VS は組み込み型のサイズも初期化します。コンパイラーごとに初期化値が異なり、C++ ではそれらの値を指定しません。
カスタム型のメンバー変数の場合、このメンバー変数のデフォルトのコンストラクターを呼び出して初期化する必要があります。このメンバー変数にデフォルトのコンストラクターがない場合、このメンバー変数を初期化する場合は、初期化リストを使用して解決する必要があります。
概要: ほとんどの場合、コンストラクターを自分で実装する必要があります。いくつかのケースでは、MyQueue に似ており、スタックにデフォルトのコンストラクターがある場合、MyQueue を自動的に生成して使用できます。
- ~Stack()
- {
- free(_a);
- _a = nullptr;
- _top = _capacity = 0;
- }
デストラクタの特徴:
1. デストラクタ名の前に文字~が付きます。
2. パラメーターも戻り値もありません (コンストラクターと一致します)。
3. クラスにはデストラクターを 1 つだけ含めることができます。定義が表示されない場合、システムはデフォルトのデストラクターを自動的に生成します。
4. オブジェクト宣言サイクルが終了すると、システムは自動的にデストラクターを呼び出します。
5. コンストラクターと同様に、コンパイラーによって自動的に生成されるデストラクターを作成しません。また、カスタム型メンバーが他のデストラクターを呼び出す組み込み型メンバーを処理しません。
6. デストラクターを表示すると、カスタム型メンバーのデストラクターも呼び出されることにも注意してください。つまり、カスタム型メンバーのデストラクターは、状況に関係なく自動的に呼び出されます。
- //text.cpp
- #include<iostream>
- using namespace std;
- typedef int STDataType;
- class Stack
- {
- public:
- Stack(int n = 4)
- {
- _a = (STDataType*)malloc(sizeof(STDataType) * n);
- if (nullptr == _a)
- {
- perror("malloc申请失败");
- }
- _capacity = n;
- _top = 0;
-
-
- }
-
- ~Stack()
- {
- free(_a);
- _a = nullptr;
- _top=_capacity=0;
- }
- private:
- STDataType* _a;
- size_t _capacity;
- size_t _top;
-
- };
- //两个Stack实现队列
- class MyQueue
- {public:
- //编译器默认生成MyQueue的构造函数调用了Stack的构造,完成了两个成员的初始化
- //编译器默认生成MyQueue的析构函数调用了Stack的析构,释放了Stack内部的资源
- //显示写析构也会调用Stack的析构
- ~MyQueue()
- {
- cout << "~MyQueue" << endl;
- }
- private:
-
- Stack pushst;
- Stack popst;
-
- };
-
-
- int main()
- {
-
- MyQueue my;
-
-
- return 0;
- }
MyQueue のデストラクターは何も行いませんが、C++ では、メモリを解放するために他のデストラクターが呼び出されることが規定されています。
リソースが要求されない場合、デストラクターを記述する必要はありません。コンパイラーによって生成されたデフォルトのデストラクター (Date など) を直接使用できます。生成されたデフォルトのデストラクターが使用できる場合は、デストラクターを明示的に記述する必要はありません。 MyQueueなどのリソースアプリケーションがありますが、破棄する場合は必ずデストラクタを直接記述してください。そうしないとスタックなどのリソースリークが発生します。
-
-
- bool operator<(Date d1, Date d2)
- {
-
- }
- bool operator==(Date d1,Date d2)
- {
- return d1._year == d2._year && d1._month == d2._month && d1._day == d2._day;
- }
- //text.cpp
- #include<iostream>
- using namespace std;
-
- class Date
- {
- public:
- Date(int year, int month, int day)
- {
- _year= year;
- _month = month;
- _day = day;
-
- }
-
-
-
- int _year;
- int _month;
- int _day;
-
- };
-
- bool operator<(Date d1, Date d2)
- {
-
- }
- bool operator==(Date d1,Date d2)
- {
- return d1._year == d2._year && d1._month == d2._month && d1._day == d2._day;
- }
- int main()
- {
-
- Date d1(2024, 7, 10);
- Date d2(2024,7,9);
- //两种用法都可以
- d1 == d2;
- operator==(d1 , d2);
- return 0;
- }