000
27.06.2008, 08:53 Uhr
~Der Rätsler
Gast
|
Hier habt ihr mal eine Übung, die ich persönlich sehr nett fand. Dabei wurde einem einiges klar, zumindest ging es mir so ;-) ------------------------------------------------------------------------------------------
Versuchen Sie heraus zu finden, was das folgende Programm macht und beantworten Sie die Fragen.
Beispiel für Programmlauf:
Herbart 1 Mueller 2 Schmidt 2 Seghardt 1 0 0
Auflistung aller Studenten:
1. Herbart 2. Mueller 3. Mueller 4. Schmidt 5. Schmidt 6. Seghardt
Anzahl Studenten: 6
C++: |
/* Erzeugung einer Liste der Nachnamen von Studenten eines Semesters Anwendung des Kopierkonstruktors, new und delete */
#include <iostream> #include <vector> #include <string> using namespace std;
class Name { private: string str; int iNummer; // 1. public: // Standardkonstruktor Name () : iNummer(++iAnzahl){ // 2. } // Kopierkonstruktor Name (Name & const objekt) : iNummer(++iAnzahl){ // 3. str = objekt.str; }
void setName(string str){ this->str = str; // 4. }
string getName(){ return str; }
int const getNummer() { return iNummer; }
static int iAnzahl; };
int Name::iAnzahl = 0;
int main() { string str; int iAnzahl; vector<Name *> pvecName; // 5. while (true) { cout << "Nachname und Anzahl (Ende 0 0): "; cin >> str >> iAnzahl; // iAnzahl ist nicht gleich Name::iAnzahl if (!iAnzahl) // 6. break; pvecName.push_back(new Name); // 7., 8., 9. pvecName.back()->setName(str); // 10., 11.
for (int j = 1; j < iAnzahl; j++) { // 12. pvecName.push_back(new Name(*(pvecName.back()))); // 13. }
}
cout << "Ausgabeliste der Studenten:\n" << endl;
for (size_t k = 0; k < pvecName.size(); ++k) { cout << pvecName.at(k)->getNummer() << ". " << \ pvecName.at(k)->getName() << endl; } cout << endl; cout << "Anzahl Studenten: " << Name::iAnzahl << endl;
for (k = 0; k < pvecName.size(); ++k) { delete pvecName.at(k); // 14. } return 0; }
|
1. Warum enthält die Klasse zwei Variablen iNummer und iAnzahl, anstatt nur eine?
2. Wie ist diese Konstruktion zu verstehen? ": iNummer(++iAnzahl)"
3. Was würde in der Programmausgabe verändert, wenn der Kopierkonstruktor durch einen Standardkopierkonstruktor ersetzt würde, und warum?
4. Warum wird hier der this-Zeiger angewandt und wie müsste man die Methode ändern, damit er überflüssig wird?
5. Was wird in dieser Zeile erzeugt?
6. Wofür wird diese if-Abfrage benötigt?
7. Was bewirkt die Methode push_back() hier?
8. was macht "new Name"?
9. Warum stehen hinter "Name" in diesem Fall keine Klammern?
10. Was bewirkt die Methode back() ?
11. Was bedeuten in dem Ausdruck "pvecName.back()->setName(str)" der Punkt und der Pfeil?
12. Beschreiben Sie den Sinn dieser Schleife für die Programmausgabe.
13. Beschreiben Sie diese Konstruktion: "new Name(*(pvecName.back())" und gehen Sie dabei auch auf den Stern ein.
14. Warum wird hier nicht delete [] sondern nur delete verwendet?
15. Beschreiben Sie den Gesamtablauf des Programms in ca. 3 bis 8 Sätzen, ohne auf die programmiertechnischen Details einzugehen.. |