Heim > Backend-Entwicklung > C#.Net-Tutorial > Zusammenfassung der wichtigsten Punkte drei der C++-Überprüfung – Konstruktor

Zusammenfassung der wichtigsten Punkte drei der C++-Überprüfung – Konstruktor

黄舟
Freigeben: 2017-01-16 11:21:22
Original
1357 Leute haben es durchsucht

Konstruktor: Die Funktion mit demselben Namen wie die Klasse ist der Konstruktor, ohne Rückgabewerttypdeklaration.

Klassifizierung von Konstruktoren: Parameterloser Konstruktor, parametrisierter Konstruktor, Zuweisungs-(Kopier-)Konstruktor

Test() //无参构造函数定义
Test(inta, int b) //有参构造函数定义
Test(const Test &obj) //拷贝构造函数定义
Nach dem Login kopieren

Die folgenden drei Arten von Konstruktoren werden separat besprochen

1. Parameterloser Konstruktor

Aufrufmethode: Test t1, t2; //Das ist leicht zu verstehen

2 Es gibt drei Arten von parametrisierten Konstruktoren

Aufrufmethode:

class Test5
{ public: 
Test5(inta); 
Test5(int a, int b);
}
void main()
{ Test5 t1(10); //c++编译器默认调用有参构造函数 括号法
Test5 t2 = (20, 10); //c++编译器默认调用有参构造函数 等号法
Test5 t3 = Test5(30); //程序员手工调用构造函数 产生了一个对象 直接调用构造构造函数法
}
Nach dem Login kopieren

3. Kopierkonstruktor

Warum es einen Kopierkonstruktor gibt – um das Kopierproblem von Klassenobjekten zu lösen

Für gewöhnliche Typen Für Objekte, Kopieren zwischen Sie sind sehr einfach, zum Beispiel:

int a=88;
int b=a;
Nach dem Login kopieren

Klassenobjekte unterscheiden sich jedoch von gewöhnlichen Objekten. Die interne Struktur von Klassenobjekten ist im Allgemeinen komplexer und es gibt verschiedene Mitgliedsvariablen. Schauen wir uns ein einfaches Beispiel für das Kopieren von Klassenobjekten an.

#include <iostream>
using namespace std;
class CExample {
private:
 int a;
public:
 CExample(int b)
 { a=b;}
 void Show ()
 {
cout<<a<<endl;
}
};
int main()
{
 CExample A(100);
 CExample B=A;
 B.Show ();
 return 0;
}
Nach dem Login kopieren

Führen Sie das Programm aus und der Bildschirm gibt 100 aus. Aus den laufenden Ergebnissen des obigen Codes ist ersichtlich, dass das System Speicher für Objekt B zuweist und den Kopiervorgang mit Objekt A abschließt. Was Klassenobjekte betrifft, wird der gesamte Kopiervorgang von Klassenobjekten desselben Typs über den Kopierkonstruktor abgeschlossen. Das folgende Beispiel veranschaulicht den Arbeitsprozess des Kopierkonstruktors.

#include <iostream>
using namespace std;
class CExample {
private:
int a;
public:
CExample(int b)
{ a=b;}
CExample(const CExample& C)
{
a=C.a;
}
void Show ()
{
cout<<a<<endl;
}
};
int main()
{
CExample A(100);
CExample B=A;
B.Show ();
return 0;
} 
CExample(const CExample&
C)
Nach dem Login kopieren

ist unser benutzerdefinierter Kopierkonstruktor. Es ist ersichtlich, dass der Kopierkonstruktor ein spezieller Konstruktor ist. Der Name der Funktion muss mit dem Klassennamen übereinstimmen. Dieser Parameter ist vom Typ const und unveränderlich. Beispiel: Die Form des Kopierkonstruktors der Klasse X ist X(X& x).

Wenn ein initialisiertes benutzerdefiniertes Klassentypobjekt verwendet wird, um ein anderes neu erstelltes Objekt zu initialisieren, wird der Kopierkonstruktor automatisch aufgerufen. Mit anderen Worten: Wenn ein Objekt der Klasse kopiert werden muss, wird der Kopierkonstruktor aufgerufen. Der Kopierkonstruktor wird in den folgenden Situationen aufgerufen:

Ein Objekt wird als Wert an den Funktionskörper übergeben

Ein Objekt wird von der Funktion als Wert zurückgegeben

Ein Objekt muss durch ein anderes Objekt initialisiert werden.

Wenn ein Kopierkonstruktor nicht explizit in der Klasse deklariert ist, generiert der Compiler automatisch einen Standardkopierkonstruktor, der bitweise Kopien zwischen Objekten durchführt. Die Bitkopie wird auch als flache Kopie bezeichnet, was später erläutert wird.

Der benutzerdefinierte Kopierkonstruktor ist ein guter Programmierstil, der verhindern kann, dass der Compiler einen Standardkopiekonstruktor erstellt, und die Effizienz des Quellcodes verbessert.

Flache Kopie und tiefe Kopie

In einigen Fällen müssen Mitgliedsvariablen innerhalb einer Klasse dynamisch Heap-Speicher zuweisen. Wenn eine Bitkopie durchgeführt wird, wird der Wert im Objekt vollständig in ein anderes kopiert Objekt. Objekt, z. B. A=B. Wenn zu diesem Zeitpunkt ein Mitgliedsvariablenzeiger in B Speicher zugewiesen hat, zeigt die Mitgliedsvariable in A auch auf denselben Speicher. Dies führt zu einem Problem: Wenn B den Speicher freigibt (z. B. durch Zerstörung), wird der Zeiger in A zu einem Platzhalterzeiger und es tritt ein Laufzeitfehler auf.

Tiefes Kopieren und flaches Kopieren können einfach so verstanden werden: Wenn eine Klasse Ressourcen besitzt, werden die Ressourcen neu zugewiesen, wenn das Objekt dieser Klasse kopiert wird. Im Gegenteil Keine Neuzuweisung von Ressourcen. Es ist eine oberflächliche Kopie. Hier ist ein Beispiel für Deep Copy.

#include <iostream>
using namespace std;
class CA
{
 public:
  CA(int b,char* cstr)
  {
   a=b;
   str=new char[b];
   strcpy(str,cstr);
  }
  CA(const CA& C)
  {
   a=C.a;
   str=new char[a]; //深拷贝
   if(str!=0)
    strcpy(str,C.str);
  }
  void Show()
  {
   cout<<str<<endl;
  }
  ~CA()
  {
   delete str;
  }
 private:
  int a;
  char *str;
};
int main()
{
 CA A(10,"Hello!");
 CA B=A;
 B.Show();
 return 0;
}
Nach dem Login kopieren

Die Definition von Deep Copy und Shallow Copy kann einfach so verstanden werden: Wenn eine Klasse Ressourcen besitzt (Heap oder andere Systemressourcen), wenn das Objekt dieser Klasse ist kopiert, kann dieser Vorgang als tiefe Kopie bezeichnet werden. Wenn das Objekt über Ressourcen verfügt, die Ressourcen jedoch während des Kopiervorgangs nicht kopiert werden, wird es als flache Kopie betrachtet.

Nach dem oberflächlichen Kopieren von Ressourcen ist der Besitz der Ressourcen unklar, wenn die Ressourcen freigegeben werden, was zu Fehlern bei der Programmausführung führt.

Test (Test &c_t) ist ein benutzerdefinierter Kopierkonstruktor. Der Name des Kopierkonstruktors muss mit dem Klassennamen übereinstimmen. Der formale Parameter der Funktion ist eine Referenzvariable dieses Typs und muss eine Referenz sein.

Wenn Sie ein bereits initialisiertes benutzerdefiniertes Klassentypobjekt verwenden, um ein anderes neu erstelltes Objekt zu initialisieren, wird der Kopierkonstruktor automatisch aufgerufen. Wenn Sie keinen benutzerdefinierten Kopierkonstruktor haben, stellt das System einen Standardkopierkonstruktor zur Vervollständigung bereit Dieser Prozess wird durch die Anweisung p1=c_t.p1; im Kopierkonstruktor Test (Test &c_t) vervollständigt.

Das Obige ist die dritte Zusammenfassung der wichtigsten Punkte der C++-Überprüfung – der Inhalt des Konstruktors. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage