2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Inhaltsverzeichnis
4.Standard-Memberfunktionen von Klassen
Klassendefinitionsformat
class ist das Schlüsselwort, das die Klasse definiert, Stack ist der Name der Klasse und {} ist der Hauptteil der Klasse. Beachten Sie, dass das Semikolon am Ende der Definition nicht weggelassen wird. Die Inhalte im Klassenkörper werden als Mitglieder der Klasse bezeichnet: Variablen in der Klasse werden als Attribute oder Mitgliedsvariablen der Klasse bezeichnet; Funktionen in der Klasse werden als Methoden oder Mitgliedsfunktionen der Klasse bezeichnet.
- //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++ ist eine Möglichkeit, die Kapselung zu implementieren, indem Klassen verwendet werden, um die Eigenschaften und Methoden eines Objekts zu kombinieren, um das Objekt vollständiger zu machen und seine Schnittstelle über Zugriffsrechte selektiv externen Benutzern bereitzustellen.
- //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;
- }
Zusätzliche Bemerkungen:
Die Klasse definiert einen neuen Bereich. Wenn Sie Mitglieder außerhalb der Klasse definieren, müssen Sie den ::scope-Operator verwenden, um anzugeben, zu welchem Klassenbereich das Mitglied gehört.
Die Klassendomäne wirkt sich auf die Suchregeln der Kompilierung aus. Wenn Init im folgenden Programm die Klassendomäne Stack nicht angibt, behandelt der Compiler Init als globale Funktion. Wenn er während der Kompilierung keine Mitglieder wie _top findet, wechselt er zu Klassendomäne, um sie zu finden.
- //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;
- }
Beachten:
- //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;
- }
-
-
Regeln zur Speicherausrichtung
- 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,为了占位标识对象存在
Nachdem der Compiler kompiliert wurde, fügen die Mitgliedsfunktionen der Klasse standardmäßig einen Zeiger auf die aktuelle Klasse an der ersten Position des formalen Parameters hinzu, der als dieser Zeiger bezeichnet wird.
Der Init-Prototyp in der Date-Klasse ist beispielsweise void Init (Date * const this, int year, int month, int day). Beim Zugriff auf Mitgliedsvariablen in den Mitgliedsfunktionen der Klasse wird über den This-Zeiger auf die Essenz zugegriffen. wie _year in der Init-Funktion, this->_year=year
Prototyp:
- 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();
-
echter Prototyp
- 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++ legt fest, dass dieser Zeiger nicht an die Stelle tatsächlicher Parameter und formaler Parameter geschrieben werden darf (der Compiler wird ihn beim Kompilieren verarbeiten), dieser Zeiger kann jedoch explizit im Funktionskörper verwendet werden Der Inhalt, auf den dieser Zeiger zeigt, kann
Dieser Zeiger wird auf dem Stapel gespeichert
Die Standard-Member-Funktion ist eine Member-Funktion, die nicht explizit vom Benutzer definiert wird und automatisch vom Compiler generiert wird. Sie wird als Standard-Member-Funktion bezeichnet.
Der Konstruktor ist eine spezielle Mitgliedsfunktion. Es ist zu beachten, dass der Konstruktor zwar als Konstruktor bezeichnet wird, der Hauptinhalt des Konstruktors jedoch nicht darin besteht, Platz zum Erstellen von Objekten zu schaffen (das lokale Objekt, das wir normalerweise verwenden, ist der Platz, der geöffnet wird). Der Stapelrahmen wird erstellt) ), aber das Objekt wird initialisiert, wenn das Objekt instanziiert wird. Der Kern des Konstruktors besteht darin, die Funktion der Init-Funktion zu ersetzen, die wir zuvor in den Klassen Stack und Date geschrieben haben. Der automatische Aufruf des Konstruktors ersetzt die Init-Funktion perfekt.
Merkmale des Konstruktors:
- 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;
-
- };
Der parameterlose Konstruktor, der Standardkonstruktor und der vom Compiler standardmäßig generierte Konstruktor, wenn wir keinen Konstruktor schreiben, werden alle als Standardkonstruktoren bezeichnet. Aber nur einer dieser drei kann existieren, nicht gleichzeitig. Obwohl der parameterlose Konstruktor und der vollständige Standardkonstruktor eine Funktionsüberladung darstellen, kommt es beim Aufruf zu Mehrdeutigkeiten.Beachten Sie, dass der Standardkonstruktor nicht nur der vom Compiler standardmäßig generierte ist, sondern auch der Konstruktor, der parameterlose Konstruktor, und der vollständige Standardkonstruktor ist auch der Standardkonstruktor. Zusammenfassend lässt sich sagen, dass er ohne Übergabe von Parametern aufgerufen werden kann.
Wir schreiben es nicht. Das vom Compiler generierte Konstrukt stellt keine Anforderungen an die Initialisierung integrierter Typ-Member-Variablen. Das heißt, ob es initialisiert wird oder nicht, hängt vom Compiler ab.
- //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++ unterteilt Typen in benutzerdefinierte Typen und integrierte Typen (Basistypen). Integrierte Typen sind die nativen Datentypen, die von der Sprache bereitgestellt werden, z. B. int/char/double/pointer usw. Benutzerdefinierte Typen sind Typen, die wir selbst mithilfe von Schlüsselwörtern wie class/struct definieren.Der Konstruktor wird hier automatisch initialisiert, und VS initialisiert auch die integrierte Typgröße. Verschiedene Compiler haben unterschiedliche Initialisierungswerte, und C++ gibt diese nicht an.
Für benutzerdefinierte Mitgliedsvariablen ist es erforderlich, den Standardkonstruktor dieser Mitgliedsvariablen aufzurufen, um sie zu initialisieren.Wenn diese Mitgliedsvariable keinen Standardkonstruktor hat, wird ein Fehler gemeldet. Wenn wir diese Mitgliedsvariable initialisieren möchten, müssen wir zur Lösung eine Initialisierungsliste verwenden.
Zusammenfassung: In den meisten Fällen müssen wir den Konstruktor selbst implementieren. In einigen Fällen ähnelt er MyQueue, und wenn Stack über einen Standardkonstruktor verfügt, kann MyQueue automatisch generiert und verwendet werden.
- ~Stack()
- {
- free(_a);
- _a = nullptr;
- _top = _capacity = 0;
- }
Eigenschaften des Destruktors:
1. Dem Destruktornamen werden die Zeichen ~ vorangestellt
2. Keine Parameter und kein Rückgabewert (konsistent mit dem Konstruktor)
3. Eine Klasse kann nur einen Destruktor haben.Wenn die Definition nicht angezeigt wird, generiert das System automatisch einen Standarddestruktor.
4. Wenn der Objektdeklarationszyklus endet, ruft das System automatisch den Destruktor auf.
5. Ähnlich wie beim Konstruktor schreiben wir den vom Compiler automatisch generierten Destruktor nicht und verarbeiten nicht die integrierten Typmitglieder. Benutzerdefinierte Typmitglieder rufen andere Destruktoren auf.
6. Es ist auch zu beachten, dass bei der Anzeige des Destruktors auch der Destruktor des benutzerdefinierten Typmitglieds aufgerufen wird, was bedeutet, dass der Destruktor des benutzerdefinierten Typmitglieds unabhängig von der Situation automatisch aufgerufen wird.
- //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;
- }
Der Destruktor in MyQueue macht nichts, aber C++ schreibt vor, dass andere Destruktoren aufgerufen werden, um den Speicher freizugeben.
Wenn keine Ressourcen angefordert werden, muss der Destruktor nicht geschrieben werden und der vom Compiler generierte Standarddestruktor kann direkt verwendet werden. Wenn der generierte Standarddestruktor verwendet werden kann, ist es nicht erforderlich, den Destruktor explizit zu schreiben B. MyQueue, aber es gibt eine Ressourcenanwendung. Achten Sie beim Zerstören darauf, den Destruktor direkt zu schreiben, da es sonst zu Ressourcenverlusten wie Stack kommt
-
-
- 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;
- }