Elementares C++ – Klassen und Objekte (3) (Abbildung)

Lassen Sie uns noch einmal über den Konstruktor sprechen

In unserem vorherigen Konstruktor gibt der Compiler über den Konstruktor jedem Element des Objekts einen geeigneten Anfangswert.Dies kann jedoch nicht als Initialisierung bezeichnet werden, sondern nur als Zuweisung.;Da die Initialisierung nur einmal initialisiert werden kann und innerhalb des Konstruktors unzählige Zuweisungen vorgenommen werden können;

Initialisierungsliste

Die Initialisierungsliste ist eine Syntaxfunktion, die zum Initialisieren von Klassenmitgliedsvariablen im Konstruktor verwendet wird.
Über die Initialisierungsliste können Mitgliedsvariablen beim Erstellen des Objekts auf den angegebenen Wert initialisiert werden, anstatt Werte einzeln im Konstruktorkörper zuzuweisen.

Grammatik:Die Initialisierungsliste folgt der Konstruktorparameterliste mit einem Doppelpunkt (:) und geht dem Konstruktorkörper voran..
In der Initialisierungsliste folgen Mitgliedsvariablen Deklarationsreihenfolge aufgeführt, und verwendenKomma wird getrennt.
Die Initialisierung jeder Mitgliedsvariablen besteht aus dem Namen der Mitgliedsvariablen, gefolgt von einem Klammernund Anfangswerte oder der Aufruf anderer Konstruktoren zur Vervollständigung.

prüfen:

class A
{
    
    
private:
	int _a;
public:
    A(int a = 1)
		:_a(a)
	{
    
    
	}
	/*A(int* a)
		:_a(a)
	{
	}*/
	A(const A& a)
	{
    
    
		_a = a._a;
		cout << "A(const A& a)" << endl;
	}
	~A()
	{
    
    
		cout << "~A()" << endl;

	}
};

class Date
{
    
    
private:
	int _year;
	int _month;
	int _day;
	int& _def;
	const int _n;
public:
	Date(int year, int month = 1, int day = 1)
		:_year(year),
		_month(month),
		_day(day),
		_def(year),
		_n(10)
		
	{
    
    
	}
};
int main()
{
    
    
	Date d1=2023;
	Date d2 = (2023, 11, 4);

	Date d3 = {
    
     2023, 11, 4 };
	return 0;
}

Testen Sie Konstanten und Referenzmitglieder:

Datumselementvariablen

Fügen Sie hier eine Bildbeschreibung ein
Konstruktor der Date-Klasse
Fügen Sie hier eine Bildbeschreibung ein
definiert ein Objekt und initialisiert es auf (2023, 10, 23);
Fügen Sie hier eine Bildbeschreibung ein
Sowohl Referenz- als auch Konstantenvariablen müssen initialisiert werden
Fügen Sie hier eine Bildbeschreibung ein

Standardschrift:

Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein

Wenn die Mitgliedsvariable einen benutzerdefinierten Typ enthält:

Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein

Reihenfolge der Mitglieder:

Fügen Sie hier eine Bildbeschreibung ein

Wenn die Initialisierungsliste nicht vollständig ist:
Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein

Wenn der benutzerdefinierte Typ keinen Standardkonstruktor hat:

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

Für Klassenobjekte mit Mitgliedsvariablen benutzerdefinierten Typs können Sie:

Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

implizite Typkonvertierung

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

Bei mehreren Parametern

Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein

explizites Schlüsselwort

Dies ist ein Modifikator, der zum Ändern des Konstruktors einer Klasse verwendet wird.Wenn ein Konstruktor explizit geändert wird, wird er als expliziter Konstruktor markiert, was bedeutet, dass der Konstruktor keine implizite Typkonvertierung durchführen kann.

Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein

statisches Mitglied

Statisches Klassenmitglied:Statische Klassenmitglieder sind Mitgliedsvariablen, die von allen Objekten der Klasse gemeinsam genutzt werden. Sobald sie als statische Mitglieder deklariert sind, existiert nur eine Kopie im Speicher, und zwar vor der Instanziierung eines Objekts. Statische Klassenmitglieder müssen außerhalb der Klasse initialisiert werden.
Statische Memberfunktion:Statische Memberfunktionen arbeiten nicht mit einem bestimmten Objekt, sie haben keinen this-Zeiger, auf die direkt über den Klassennamen zugegriffen werden kann.

class A
{
    
    
public:
	A()
	{
    
    
		count++;
	} 
	A(const A& a1)
	{
    
    
		count++;
	}
	~A()
	{
    
    
		cout << "~A()" << endl;
	}
	//调取count成员变量的函数
	//静态成员函数,特点:没有this指针
	static int GetCount()
	{
    
    
		return count;
	}
private:
	//声明
	static int count;
};
//定义
int A::count = 0;

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

Freundesklasse

Freundklassen beschreiben die besondere Beziehung zwischen zwei Klassen;
Wenn eine Klasse eine befreundete Klasse einer anderen Klasse ist, kann die Klasse auf die privaten Mitglieder der anderen Klasse zugreifen..
Deklarieren Sie eine Friend-Klasse, indem Sie das Schlüsselwort Friend in der Klassendeklaration verwenden.

class Time
{
    
    
public:
	friend class Date;
	//在Time中声明Date类,在Date中可以直接访问Time的成员变量
	Time(int hour=1,int mintue=0,int sec=0)
		:_hour(hour),
		_mintue(mintue),
		_sec(sec)
	{
    
    }
private:
	int _hour;
	int _mintue;
	int _sec;
};

class Date
{
    
    
private:
	int _year;
	int _month;
	int _day;
	Time _t;
public:
	Date(int year, int month, int day)
		:_year(year),
		_month(month),
		_day(day)
	{
    
    

	}
	void SetTime(int hour, int minute, int sec)
	{
    
    
		//可以直接访问私有的成员变量
		_t._hour = hour;
		_t._mintue = minute;
		_t._sec = sec;
	}
};

Fügen Sie hier eine Bildbeschreibung ein

innere Klasse

Eine innere Klasse ist eine Klasse, die innerhalb einer anderen Klasse definiert ist.Die innere Klasse kann auf alle Mitglieder der äußeren Klasse zugreifen, einschließlich privater Mitglieder, aber die äußere Klasse kann nicht direkt auf die Mitglieder der inneren Klasse zugreifen.

class A
{
    
    
private:
	static int k;
	int h;
public:
	class B//B天生为A的友元
	{
    
    
	public:
		void f(const A& a)
		{
    
    
			cout << k << endl;//k是静态成员,可以直接使用
			cout << a.h << endl;//h是非静态成员,需要有明确的类对象
		}
	};


	~A()
	{
    
    
		cout << "~A()" << endl;
	}
};

int A::k = 1;

int main()
{
    
    
	A::B b;//B在A类中需要加上作用域符
	
	b.f(A());//A()是匿名对象
	return 0;
}

Fügen Sie hier eine Bildbeschreibung ein

anonymes Objekt

Anonyme Objekte sind Objekte ohne konkreten Namen, die direkt bei der Nutzung entstehen..
Sie werden normalerweise zur vorübergehenden Ausführung einer Methode oder Operation oder als Rückgabewert einer Methode verwendet.

Syntax: Klassenname();

Beispiel:

class Foo()
{
    
    
public:
    void display()
    {
    
    
        cout<<"this is a Foo"<<endl;
    }
}
int main()
{
    
    
    Foo().display();
}

Einige Optimierungen beim Kopieren von Funktionen

class A
{
    
    
private:
	int _a;
public:
	A(int a=1)
		:_a(a)
	{
    
    
		cout << "A(int a)" << endl;
	}
	A(const A& a)
	{
    
    
		cout << "A(const A& a)" << endl;
	}
	A& operator=(const A& a)
	{
    
    
		cout << "A& operator=(const A& a)" << endl;
		if (this != &a)
		{
    
    
			_a = a._a;
		}
		return *this;
	}
	~A()
	{
    
    
		cout << "~A()" << endl;
	}
};

 void func1(A aa)
{
    
    
	cout << "func()" << endl;
}

A func2()
{
    
    
	A aa;
	return aa;
}

A func3(A aa)
{
    
    
	
	return aa;
}

Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein

Supongo que te gusta

Origin blog.csdn.net/m0_74068921/article/details/134353471
Recomendado
Clasificación