Detaillierte Erläuterung der C++-Datenkapselung und Definitionsstruktur~

Name: Ah Yues kleiner Dongdong

Blog-Homepage: A Yue's Xiaodongdongs blog_CSDN blog-python&&c++ fortgeschrittene Kenntnisse, unerlässlich für das chinesische Neujahr, Blogger im Bereich C/C++-Wissenserklärung

Inhaltsverzeichnis

Struktur definieren

Zugriffsstrukturmitglieder

Strukturen als Funktionsargumente

Zeiger auf Struktur

typedef-Schlüsselwort

C++-Datenkapselung

Ein Beispiel für Datenkapselung

Designstrategie

C++-Klassen und -Objekte

C++-Klassendefinition

Definieren Sie ein C++-Objekt

Zugriff auf Datenelemente

schreibe am Ende


 

Führen Sie zunächst eine String-Vergleichsfunktion ein: strcmp(s1, s2), wenn s1<s2, gibt eine negative Ganzzahl zurück; wenn s1=s2, ist der Rückgabewert 0; wenn s1>s2, gibt eine positive Ganzzahl und eine String-Kopierfunktion zurück
: strcpy (a, b) bedeutet, den Wert von Zeichenfolge b in Zeichenfolge a zu kopieren. Natürlich darf die Länge von Zeichenfolge b Zeichenfolge a nicht überschreiten

Struktur definieren

Um eine Struktur zu definieren, müssen Sie  die struct-  Anweisung verwenden. Die Strukturanweisung definiert einen neuen Datentyp, der mehrere Mitglieder enthält. Das Format der Strukturanweisung ist wie folgt:

struct type_name {
member_type1 member_name1;
member_type2 member_name2;
member_type3 member_name3;
.
.
} object_names;

Typname  ist der Name des Strukturtyps, Mitgliedstyp1 Mitgliedsname1  ist eine Standardvariablendefinition wie  int i;  oder  float f;  oder andere gültige Variablendefinitionen. Am Ende einer Strukturdefinition können Sie vor dem abschließenden Semikolon eine oder mehrere Strukturvariablen angeben, dies ist optional. Im Folgenden wird ein Strukturtyp  Books deklariert . Die Variable lautet  book :

struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book;

Zugriffsstrukturmitglieder

Um auf Mitglieder einer Struktur zuzugreifen, verwenden wir den Mitgliedszugriffsoperator (.) . Der Member-Zugriffsoperator ist ein Punkt zwischen dem Strukturvariablennamen und dem Strukturmember, auf den wir zugreifen möchten.

Das folgende Beispiel demonstriert die Verwendung der Struktur:

#include <iostream>
#include <cstring>
 
using namespace std;
 
// 声明一个结构体类型 Books 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
int main( )
{
   Books Book1;        // 定义结构体类型 Books 的变量 Book1
   Books Book2;        // 定义结构体类型 Books 的变量 Book2
 
   // Book1 详述
   strcpy( Book1.title, "C++ 教程");
   strcpy( Book1.author, "Runoob"); 
   strcpy( Book1.subject, "编程语言");
   Book1.book_id = 12345;
 
   // Book2 详述
   strcpy( Book2.title, "CSS 教程");
   strcpy( Book2.author, "Runoob");
   strcpy( Book2.subject, "前端技术");
   Book2.book_id = 1234556;
 
   // 输出 Book1 信息
   cout << "第一本书标题 : " << Book1.title <<endl;
   cout << "第一本书作者 : " << Book1.author <<endl;
   cout << "第一本书类目 : " << Book1.subject <<endl;
   cout << "第一本书 ID : " << Book1.book_id <<endl;
 
   // 输出 Book2 信息
   cout << "第二本书标题 : " << Book2.title <<endl;
   cout << "第二本书作者 : " << Book2.author <<endl;
   cout << "第二本书类目 : " << Book2.subject <<endl;
   cout << "第二本书 ID : " << Book2.book_id <<endl;
 
   return 0;
}

Das Beispiel definiert den Strukturtyp Books und seine beiden Variablen Book1 und Book2. Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis:

Erster Buchtitel: Ein C++-Tutorial
Erster Buchautor: Runoob
Erste Buchkategorie: Programmiersprachen
Erste Buch-ID: 12345
Zweiter Buchtitel: Ein CSS-Tutorial
Zweiter Buchautor: Runoob
Die zweite Buchkategorie: Front-End-Technologie
Zweite Buch-ID: 1234556

Strukturen als Funktionsargumente

Sie können eine Struktur als Funktionsparameter verwenden und die Methode zur Übergabe von Parametern ähnelt der anderer Arten von Variablen oder Zeigern. Sie können das obige Beispiel verwenden, um auf Strukturvariablen zuzugreifen:

#include <iostream>
#include <cstring>
 
using namespace std;
void printBook( struct Books book );
 
// 声明一个结构体类型 Books 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
int main( )
{
   Books Book1;        // 定义结构体类型 Books 的变量 Book1
   Books Book2;        // 定义结构体类型 Books 的变量 Book2
 
    // Book1 详述
   strcpy( Book1.title, "C++ 教程");
   strcpy( Book1.author, "Runoob"); 
   strcpy( Book1.subject, "编程语言");
   Book1.book_id = 12345;
 
   // Book2 详述
   strcpy( Book2.title, "CSS 教程");
   strcpy( Book2.author, "Runoob");
   strcpy( Book2.subject, "前端技术");
   Book2.book_id = 1234556;
 
   // 输出 Book1 信息
   printBook( Book1 );
 
   // 输出 Book2 信息
   printBook( Book2 );
 
   return 0;
}
void printBook( struct Books book )
{
   cout << "书标题 : " << book.title <<endl;
   cout << "书作者 : " << book.author <<endl;
   cout << "书类目 : " << book.subject <<endl;
   cout << "书 ID : " << book.book_id <<endl;
}

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis:

Buchtitel: Ein C++-Tutorial
Autor: Runoob
Buchkategorie: Programmiersprache
Buch-ID: 12345
Buchtitel: Ein CSS-Tutorial
Autor: Runoob
Buchkategorie: Frontend-Technologie
Buch-ID: 1234556

Zeiger auf Struktur

Sie können Zeiger auf Strukturen auf ähnliche Weise wie Zeiger auf Variablen anderer Typen wie folgt definieren:

struct Books *struct_pointer;

Jetzt können Sie die Adresse der Strukturvariablen in der oben definierten Zeigervariablen speichern. Um die Adresse einer Strukturvariablen zu finden, setzen Sie den &-Operator wie folgt vor den Strukturnamen:

struct_pointer = &Book1;

Um über einen Zeiger auf diese Struktur auf ein Mitglied einer Struktur zuzugreifen, müssen Sie den ->-Operator wie folgt verwenden:

struct_pointer->title;

Lassen Sie uns das obige Beispiel mit Strukturzeigern umschreiben. Es wird Ihnen helfen, das Konzept von Strukturzeigern zu verstehen:

#include <iostream>
#include <cstring>
 
using namespace std;
void printBook( struct Books *book );
 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
int main( )
{
   Books Book1;        // 定义结构体类型 Books 的变量 Book1
   Books Book2;        // 定义结构体类型 Books 的变量 Book2
 
    // Book1 详述
   strcpy( Book1.title, "C++ 教程");
   strcpy( Book1.author, "Runoob"); 
   strcpy( Book1.subject, "编程语言");
   Book1.book_id = 12345;
 
   // Book2 详述
   strcpy( Book2.title, "CSS 教程");
   strcpy( Book2.author, "Runoob");
   strcpy( Book2.subject, "前端技术");
   Book2.book_id = 1234556;
 
   // 通过传 Book1 的地址来输出 Book1 信息
   printBook( &Book1 );
 
   // 通过传 Book2 的地址来输出 Book2 信息
   printBook( &Book2 );
 
   return 0;
}
// 该函数以结构指针作为参数
void printBook( struct Books *book )
{
   cout << "书标题  : " << book->title <<endl;
   cout << "书作者 : " << book->author <<endl;
   cout << "书类目 : " << book->subject <<endl;
   cout << "书 ID : " << book->book_id <<endl;
}

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis:

Buchtitel: Ein C++-Tutorial
Autor: Runoob
Buchkategorie: Programmiersprache
Buch-ID: 12345
Buchtitel: Ein CSS-Tutorial
Autor: Runoob
Buchkategorie: Frontend-Technologie
Buch-ID: 1234556

typedef-Schlüsselwort

Hier ist eine einfachere Möglichkeit, Strukturen zu definieren, bei der Sie den von Ihnen erstellten Typ mit einem „Alias“ versehen können. Zum Beispiel:

typedef struct Bücher
{
   char title[50];
   char Autor[50];
   char subject[100];
   int book_id;
}Bücher;

Jetzt können Sie Books direkt verwenden   , um  Variablen vom Typ Books zu definieren  , ohne das Schlüsselwort struct zu verwenden. Hier ist ein Beispiel:

Bücher Buch1, Buch2;

Sie können  das Schlüsselwort typedef verwenden  , um Nicht-Strukturtypen wie folgt zu definieren:

typedef long int *pint32;
 
pint32 x, y, z;

x, y und z sind alle Zeiger auf long int.

C++-Datenkapselung

Alle C++-Programme verfügen über die folgenden zwei Grundelemente:

  • Programmanweisungen (Code): Dies sind die Teile des Programms, die Aktionen ausführen, und sie werden Funktionen genannt.
  • Programmdaten: Daten sind Programminformationen und werden von Programmfunktionen beeinflusst.

Kapselung ist ein Konzept in der objektorientierten Programmierung, das Daten und Funktionen, die Daten manipulieren, miteinander verbindet, um Störungen und Missbrauch von außen zu vermeiden und so die Sicherheit zu gewährleisten. Die Datenkapselung führt zu einem weiteren wichtigen OOP-Konzept, dem Verbergen von Daten .

Datenkapselung ist ein Mechanismus, der Daten und Funktionen, die Daten manipulieren, miteinander verbindet, und Datenabstraktion ist ein Mechanismus, der nur Schnittstellen für Benutzer offenlegt und bestimmte Implementierungsdetails verbirgt.

C++ unterstützt die Kapselung und das Ausblenden von Daten (öffentlich, geschützt, privat) durch die Erstellung von Klassen . Wir wissen bereits, dass eine Klasse private Mitglieder, geschützte Mitglieder und öffentliche Mitglieder enthält. Standardmäßig sind alle in einer Klasse definierten Elemente privat. Zum Beispiel:

class Box
{
   public:
      double getVolume(void)
      {
         return length * breadth * height;
      }
   private:
      double length;      // 长度
      double breadth;     // 宽度
      double height;      // 高度
};

Die Variablen Länge, Breite und Höhe sind alle privat. Dies bedeutet, dass nur andere Mitglieder der Box-Klasse auf sie zugreifen können, nicht jedoch andere Teile des Programms. Dies ist eine Möglichkeit, eine Kapselung zu erreichen.

Um die Mitglieder einer Klasse öffentlich zu machen (also für andere Teile des Programms zugänglich zu machen), müssen sie  mit dem Schlüsselwort public vor ihnen  deklariert werden. Auf alle nach dem öffentlichen Bezeichner definierten Variablen oder Funktionen können alle anderen Funktionen im Programm zugreifen.

Durch die Definition einer Klasse als Freundklasse einer anderen Klasse werden Implementierungsdetails offengelegt und die Kapselung reduziert. Idealerweise sollten die Implementierungsdetails jeder Klasse so weit wie möglich vor der Außenwelt verborgen bleiben.

Ein Beispiel für Datenkapselung

In einem C++-Programm kann jede Klasse mit öffentlichen und privaten Mitgliedern als Instanz der Datenkapselung und Datenabstraktion verwendet werden. Siehe das Beispiel unten:

#include <iostream>
using namespace std;
 
class Adder{
   public:
      // 构造函数
      Adder(int i = 0)
      {
        total = i;
      }
      // 对外的接口
      void addNum(int number)
      {
          total += number;
      }
      // 对外的接口
      int getTotal()
      {
          return total;
      };
   private:
      // 对外隐藏的数据
      int total;
};
int main( )
{
   Adder a;
   
   a.addNum(10);
   a.addNum(20);
   a.addNum(30);
 
   cout << "Total " << a.getTotal() <<endl;
   return 0;
}

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis:

Insgesamt 60

Die obige Klasse addiert Zahlen und gibt die Summe zurück. Die öffentlichen Mitglieder  addNum  und  getTotal  sind externe Schnittstellen und Benutzer müssen sie kennen, um die Klasse verwenden zu können. Die  Gesamtzahl der privaten Mitglieder  ist vor der Außenwelt verborgen und Benutzer müssen nichts davon wissen, sie ist jedoch erforderlich, damit die Klasse ordnungsgemäß funktioniert.

Designstrategie

Unter normalen Umständen setzen wir den Klassenmitgliedsstatus auf privat (privat), es sei denn, wir müssen ihn wirklich offenlegen, um eine gute Kapselung sicherzustellen .

Dies gilt im Allgemeinen für Datenelemente, gilt jedoch gleichermaßen für alle Elemente, einschließlich virtueller Funktionen.

C++-Klassen und -Objekte

C++ fügt der C-Sprache objektorientierte Programmierung hinzu und C++ unterstützt objektorientierte Programmierung. Klassen sind ein Kernmerkmal von C++ und werden oft als benutzerdefinierte Typen bezeichnet.

Eine Klasse wird verwendet, um die Form eines Objekts anzugeben und ist ein benutzerdefinierter Datentyp, der eine Kombination aus gekapselten Daten und Funktionen darstellt. Daten in einer Klasse werden als Mitgliedsvariablen und Funktionen als Mitgliedsfunktionen bezeichnet. Eine Klasse kann als Vorlage betrachtet werden, mit der mehrere Objekte mit denselben Eigenschaften und demselben Verhalten erstellt werden können.

C++-Klassendefinition

Um eine Klasse zu definieren, müssen Sie das Schlüsselwort class verwenden, dann den Namen der Klasse angeben und den Hauptteil der Klasse in geschweifte Klammern einschließen. Der Hauptteil enthält die Mitgliedsvariablen und Mitgliedsfunktionen der Klasse.

Das Definieren einer Klasse ist im Wesentlichen ein Entwurf zum Definieren eines Datentyps, der definiert, was das Objekt der Klasse enthält und welche Operationen an diesem Objekt ausgeführt werden können.

 Im folgenden Beispiel verwenden wir das Schlüsselwort  class  , um den Box-Datentyp zu definieren, der die drei Mitgliedsvariablen Länge, Breite und Höhe enthält:

class Box
{
   public:
      double length;   // 盒子的长度
      double breadth;  // 盒子的宽度
      double height;   // 盒子的高度
};

Das Schlüsselwort  public  bestimmt die Zugriffsattribute von Klassenmitgliedern. Innerhalb des Klassenobjektbereichs sind öffentliche Mitglieder außerhalb der Klasse zugänglich. Sie können die Mitglieder der Klasse auch als  private  oder  protected angeben , was wir später erläutern werden.

Definieren Sie ein C++-Objekt

Klassen stellen den Bauplan für Objekte bereit, sodass Objekte grundsätzlich auf der Grundlage von Klassen erstellt werden. Objekte von Klassen werden genauso deklariert wie Variablen primitiver Typen. Die folgende Anweisung deklariert zwei Objekte der Klasse Box:

Box Box1; // Box1 deklarieren, Typ Box Box Box2; // Box2 deklarieren, Typ Box

Die Objekte Box1 und Box2 haben ihre jeweiligen Datenelemente.

Zugriff auf Datenelemente

Auf öffentliche Datenmember von Objekten einer Klasse kann mit dem direkten Memberzugriffsoperator zugegriffen werden.

Um diese Konzepte besser zu verstehen, versuchen wir das folgende Beispiel:

#include <iostream>
 
using namespace std;
 
class Box
{
   public:
      double length;   // 长度
      double breadth;  // 宽度
      double height;   // 高度
      // 成员函数声明
      double get(void);
      void set( double len, double bre, double hei );
};
// 成员函数定义
double Box::get(void)
{
    return length * breadth * height;
}
 
void Box::set( double len, double bre, double hei)
{
    length = len;
    breadth = bre;
    height = hei;
}
int main( )
{
   Box Box1;        // 声明 Box1,类型为 Box
   Box Box2;        // 声明 Box2,类型为 Box
   Box Box3;        // 声明 Box3,类型为 Box
   double volume = 0.0;     // 用于存储体积
 
   // box 1 详述
   Box1.height = 5.0; 
   Box1.length = 6.0; 
   Box1.breadth = 7.0;
 
   // box 2 详述
   Box2.height = 10.0;
   Box2.length = 12.0;
   Box2.breadth = 13.0;
 
   // box 1 的体积
   volume = Box1.height * Box1.length * Box1.breadth;
   cout << "Box1 的体积:" << volume <<endl;
 
   // box 2 的体积
   volume = Box2.height * Box2.length * Box2.breadth;
   cout << "Box2 的体积:" << volume <<endl;
 
 
   // box 3 详述
   Box3.set(16.0, 8.0, 12.0); 
   volume = Box3.get(); 
   cout << "Box3 的体积:" << volume <<endl;
   return 0;
}

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis:

Volumen von Box1: 210
Volumen von Box2: 1560
Volumen von Box3: 1536

Beachten Sie, dass auf private und geschützte Mitglieder nicht direkt mit dem Direktzugriffsoperator für Mitglieder (.) zugegriffen werden kann. In den folgenden Tutorials erfahren Sie, wie Sie auf private und geschützte Mitglieder zugreifen.

schreibe am Ende

Fieber, unangenehm, aber da ich schon lange keinen Blog mehr gepostet habe, holte ich meine Unterrichtsnotizen heraus und ging zu Bett, tschüss

Supongo que te gusta

Origin blog.csdn.net/m0_64122244/article/details/130657265
Recomendado
Clasificación