Detaillierte Erklärung der const-Memberfunktionen und Initialisierungslisten in C++! ! ! (Unter Klassen und Objekte)

Inhaltsverzeichnis

1.const-Mitgliedsfunktion

1.1Was ist eine const-Memberfunktion?

1.2 Implementierung von const-Memberfunktionen

1.3 Unter welchen Umständen sollte const hinzugefügt werden?

1.4 Das Problem der Erweiterung und Reduzierung von Berechtigungen

2. Initialisierungsliste

2.1 Was ist die Initialisierungsliste?

2.2 Warum gibt es eine Initialisierungsliste?

2.3 Implementierung der Initialisierungsliste

2.4 Durch die Initialisierungsliste gelöste Probleme


1.const-Mitgliedsfunktion

1.1Was ist eine const-Memberfunktion?

Nehmen Sie die Datumsklasse als Beispiel. Informationen zur spezifischen Implementierung finden Sie in meinem Bloghttp://t.csdnimg.cn/lFS4c

Wenn wir die Mitgliedsfunktion des Objekts aufrufen, übergeben wir den Parameter implizit an diesen Zeiger, und der Standardtyp dieses Zeigers istDate * const this , die const-Mitgliedsfunktion besteht darin, den Typ dieses Zeigers in const Date* const this.

Gewöhnliche Mitgliedsfunktion dieses Zeigertyps:Datum *const 

const-Mitgliedsfunktion dieser Zeigertyp: const Datum *const 

1.2 Implementierung von const-Memberfunktionen

Die Schwierigkeit besteht darin, dass diesem Zeiger keine expliziten Parameter übergeben werden können. Daher schreibt die C++-Grammatik vor, dass Sie beim Definieren einer Mitgliedsfunktion hier const hinzufügen können, um den Typ dieses Zeigers zu ändern.

Funktionsname (Parameter) vom Rückgabewerttyp (const)

Ohne const diesen Zeigertyp:Datum *const 

Fügen Sie const diesen Zeigertyp hinzu: const Date *const 

1.3 Unter welchen Umständen sollte const hinzugefügt werden?

Nicht hinzugefügtConst-Member-Funktion: Das Objekt, auf das dieser Zeiger zeigtmuss geändert werden

Const-Mitgliedsfunktion hinzufügen: Das Objekt, auf das dieser Zeiger zeigtMuss nicht geändert werden

In praktischen Anwendungen sollten wir const hinzufügen, solange der Inhalt, auf den dieser Zeiger in der von Ihnen definierten Mitgliedsfunktion zeigt, nicht geändert werden muss

1.4 Das Problem der Erweiterung und Reduzierung von Berechtigungen

Berechtigungen können verschoben und reduziert, aber nicht erweitert werden! ! !

Const-Memberfunktionen können von Const-Objekten (Berechtigungsübersetzung) und von Nicht-Const-Objekten ()Eingeschränkte Berechtigungen

Nicht-konstante Mitgliedsfunktionen  können nicht von konstanten Objekten aufgerufen werden (Berechtigungserweiterung). ), kann von nicht konstanten Objekten aufgerufen werden (Berechtigungsübersetzung)

2. Initialisierungsliste

2.1 Was ist die Initialisierungsliste?

In der Initialisierungsliste werden Mitgliedsvariablen definiert! ! !

Wenn Sie wissen möchten, was die Initialisierungsliste ist, können Sie auf unseren Konstruktor nicht verzichten. Wenn Sie nicht wissen, was die sechs Standard-Memberfunktionen in C++ sind, empfehle ich Ihnen, diesen Blog zu lesenhttp://t.csdnimg.cn/ZcFZD

Als nächstes nehmen wir die Datumsklasse als Beispiel, um die Initialisierungsliste ausführlich zu erläutern.

class Date
{
private:
	int _year;
	int _month;
	int _day;
public:
	//构造函数
	Date(int year = 2000, int month = 1, int day = 1)
	{
        //函数体内初始化
		_year = year;
		_month = month;
		_day = day;
	}
};

2.2 Warum gibt es eine Initialisierungsliste?

Wir wissenIn der Initialisierungsliste werden Mitgliedsvariablen definiert. Wenn es keine Initialisierungsliste gibt, dann die folgenden Typen Was soll ich tun, wenn während der Definition initialisiert werden muss?

Anführungszeichentyp   int& a

Const modifizierter Typ  const aa

Benutzerdefinierter Typ (keine Standardkonstruktion)  T aaa

Referenzen müssen initialisiert werden, wenn sie definiert werden, durch Konstanten geänderte Variablen müssen initialisiert werden, wenn sie definiert werden, und benutzerdefinierte Typen (ohne Standardkonstruktoren) müssen initialisiert werden, wenn sie definiert werden.

2.3 Implementierung der Initialisierungsliste

class Date
{
private:
	//成员声明的地方
	int _year;
	int _month;
	int _day;
	int& _a;
	const int _aa;
public:
	//构造函数
	Date(int year = 2000, int month = 1, int day = 1)
		//初始化列表是成员变量定义的地方
		:_year(year)
		,_month(month)
		,_day(day)
		,_a(year)
		,_aa(day)
	{
	}
};

C++ legt fest, dass die Initialisierungsliste trotzdem durchlaufen wird, wenn wir die Initialisierungsliste nicht explizit schreiben.Der integrierte Typ wird nicht verarbeitet, der benutzerdefinierte Typ jedoch nicht ruft seinen Standardkonstruktor auf

2.4 Durch die Initialisierungsliste gelöste Probleme

 1. Die Initialisierung muss dort angezeigt werden, wo sie definiert ist. Die Referenzkonstante verfügt nicht über ein standardmäßig erstelltes benutzerdefiniertes Mitglied.

 2. Einige benutzerdefinierte Mitglieder möchten die Initialisierung anzeigen und selbst steuern.

 Versuchen Sie, die Initialisierung der Initialisierungsliste zu verwenden

Die Reihenfolge der Initialisierungsliste hat nichts mit der Reihenfolge der Initialisierungsliste zu tun. Sie wird in der Reihenfolge initialisiert, in der die Mitgliedsvariablen deklariert werden! ! !

class A
{
public:
    A(int a)
        :_a1(a)
        , _a2(_a1)
    {}

    void Print() {
        cout << _a1 << " " << _a2 << endl;
    }
private:
    int _a2;
    int _a1;
};

int main()
{
    A aa(1);
    aa.Print();
}

おすすめ

転載: blog.csdn.net/qq_73955920/article/details/134330152