member functions
-
hey,
class Sales_item { public: // operations on Sales_item objects double avg_price() const; bool same_isbn(const Sales_item &rhs) const { return isbn == rhs.isbn; } private: std::string isbn; unsigned units_sold; double revenue; };ich habe mir jetzt das kapitel 2x durchgelesen und ich bin immernoch nicht schlauer geworden.

frage 1:
public privat was genau bedeutet das ?kann ich mir privat wie eine forschleife vorstellen zB for (int i =0; i!=2; ++i)
wo man außerhalb der schleife keinen zugriff auf i hat ?frage 2:
double avg_price() const;hat doch keine aufgabe oder ? dieser code gibt wohl kaum der average price aus. wofür ist er gut ?
frage 3 :
bool same_isbn(const Sales_item &rhs) const { return isbn == rhs.isbn; }ok , ist bool gibt also true oder false aus. er vergleich isbn mit rhs.isbn
so weit so gut.
gecalled wird diese member fucktion mit zbtotal.same_isbn(trans);Warum ist es sales_item const ?
Warum ist es Sales_item &rhs und nicht
Sales_item rhs?Woher weiß das programm das same_isbn auf string isbn zurückgreift ?
string isbn wurde doch lediglich in privat deklariert. ich weiß das this auf isbn zeigen soll, aber es wurde doch nirentwo gesagt, dass this wirklich auf isbn zeigen soll. ich bin verwirrt
ich hoffe ihr könnt mir mal wieder helfen

danke
-
Das sind alles fragen, die man sich mit einem einfachen Einsteigerbuch/Tutorial selbst beantworten könnte. Sich "private" wie Gültiggeitsbereiche vorzustellen halte ich für nicht gut, das trifft es nicht. Die Variablen existieren solange, wie das Objekt der Klasse existiert. Das private bedeutet einfach, dass nur das Objekt der Klasse Zugriff auf diese Member hat. Konkret:
class A { public: void setI(int val) { i = val; } private: int i; }; int main() { A a; a.setI(5); // alles klar a.i = 5; // geht nicht! }http://de.wikipedia.org/wiki/Datenkapselung_(Programmierung)
Zu deinen anderen Fragen: Das sind Referenzen. Referenzen zeigen auf etwas (so wie Pointer), allerdings werden sie so behandelt wie das Objekt auf das sie zeigen. Dazu auch:
http://de.wikibooks.org/wiki/C%2B%2B-Programmierung/_Weitere_Grundelemente/_ReferenzenEdit @SeppJ:
Heute ist aber der Wurm drin.
-
Darf ich dir nahelegen die Kapitel davor gründlich zu lesen? Das sind allesamt Lehrbuchfragen und nicht wenige. Und bei vielen deiner Fragen ist es ziemlich wichtig, dass man die Antworten wirklich gründlich verstanden hat, weil sie wichtige Grundlagen sind. Und ein Forumsbeitrag kann nicht mithalten, wo ein Lehrbuch diese Fragen über mehrere Kapitel beantworten wird (du fragst ziemlich viel). Selbst wenn sich hier jemand viel Mühe gibt, werden nicht mehr als 5 Sätze pro Antwort rauskommen, bei denen du es dann doch nicht verstehst, wenn du die Hintergründe nicht kennst.
edit: Wie passend. cooky451s Antwort bezieht sich in 3 Sätzen auf deine Frage, dazu 1 Codebeispiel und 1 Link. Recht ausfuhrlich. Hast du, kantaki, jetzt mehr Durchblick, was private und public bedeuten?
Edit @SeppJ:
Heute ist aber der Wurm drin.
Joa. Mal ordentlich ausschlafen. Morgen bin ich wieder schneller
.
-
kantaki schrieb:
frage 1:
public privat was genau bedeutet das ?kann ich mir privat wie eine forschleife vorstellen zB for (int i =0; i!=2; ++i)
wo man außerhalb der schleife keinen zugriff auf i hat ?Mit der for()-Schleife und Scope-Einschränkungen hat das weniger zu tun. Es geht darum, wer berechtigt ist, die Variablen zu nutzen (public: jeder, protected: eigene Methoden, Freunde und abgeleitete Klassen, private: nur eigene Methoden und Freunde).
frage 2:
double avg_price() const;hat doch keine aufgabe oder ? dieser code gibt wohl kaum der average price aus. wofür ist er gut ?
Das ist nur eine Deklaration der Methode. Was sie macht, mußt du noch irgendwo anders festlegen per
double Sales_item::avg_proce() const { // passende Berechnungen return 4711; }frage 3 :
bool same_isbn(const Sales_item &rhs) const { return isbn == rhs.isbn; }ok , ist bool gibt also true oder false aus. er vergleich isbn mit rhs.isbn
so weit so gut.
gecalled wird diese member fucktion mit zbtotal.same_isbn(trans);Warum ist es sales_item const ?
Warum ist es Sales_item &rhs und nicht
Sales_item rhs?Das & ist eine Referenz und erspart es dir, den übergebenen Parameter zu kopieren, die beiden const verhindern dann, daß du versehentlich den Inhalt von *this (alias total) oder rhs (alias trans) veränderst.
Woher weiß das programm das same_isbn auf string isbn zurückgreift ?
string isbn wurde doch lediglich in privat deklariert. ich weiß das this auf isbn zeigen soll, aber es wurde doch nirentwo gesagt, dass this wirklich auf isbn zeigen soll. ich bin verwirrt
Es gibt recht klare Regeln (Stichwort: Scope), nach welchen Prinzipien Bezeichner zugeordnet werden. Und hier gibt es nur eine in Frage kommende Variable namens "isbn" (der String-Member von this), deshalb wird dieser verwendet).
-
1:
Äh, ja, ein kleines bisschen kannst du das mit dem Variable Scope vergleichen.
Du kannst auf private-Member nur von innerhalb der Klasse zugreifen, also aus ihren Funktionen heraus.2:
Das ist eine Funktions-Deklaration.3:
Es ist const, weil es nicht verändert wird.
Es ist eine Referenz, weil sonst das ganze Objekt kopiert werden müsste.
this->isbn wäre nur nötig, wenn isbn mehrdeutig wäre, es also z.B. eine lokale Variable gebe, die auch isbn heißt.
-
@seppj
das codebeispiel von coocky ist sehr gut ! ich habe es sofort verstanden.eigentlich sind alle fragen zu 100% geklärt worden.
vielen dank , ich weiß garnicht was ich ohne euch tun sollte

Es gibt recht klare Regeln (Stichwort: Scope), nach welchen Prinzipien Bezeichner zugeordnet werden. Und hier gibt es nur eine in Frage kommende Variable namens "isbn" (der String-Member von this), deshalb wird dieser verwendet).
genau diese regeln kannte ich nocht nicht, aber ich habe mir schon etwas in dieser richtung gedacht.
was würde denn passieren wenn in private string isbn, isbn1,isbn2; stehen würde ?
würde dann der erste string isbn genommen ?kann ich diese regel irgentwo nachlesen ? wie heißt das stichwort dazu ?
-
kantaki schrieb:
genau diese regeln kannte ich nocht nicht, aber ich habe mir schon etwas in dieser richtung gedacht.
was würde denn passieren wenn in private string isbn, isbn1,isbn2; stehen würde ?
würde dann der erste string isbn genommen ?Er würde die erste Variable verwenden, weil die übrigen völlig andere Namen haben (für die Namensauflösung zählt nur eine exakte Übereinstimmung, sogar
Isbnwäre etwas anderes alsisbn)
-
okay so ganz hab ich es doch nicht verstanden. ist mir ja schon peinlich nochmal zu fragen

bool same_isbn(const Sales_item &rhs) const { return isbn == rhs.isbn; } total.same_isbn(trans)okay rhs ist eine reference von trans
dh rhs.isbn ist das selbe wie trans.isbn
und wenn same_isbn gecalled wird, wird total mit isbn gebunden
also wäre das equivalent zu
isbn == rhs.isbntotal.isbn == trans.isbn oder ?
mich verwirrt nur das .isbn.
was ich mir denke ist das der wert von total auf isbn gezeigt wird und trans auf isbn gezeigt wird. dann bräuchte man nur ein var zu deklarieren.
naja am besten schaue ich mir mal ein tutorial im inet an, ich will euch nicht noch mehr quälen.
-
also wäre das equivalent zu
isbn == rhs.isbntotal.isbn == trans.isbn oder ?
Theoretisch schon, aber weil isbn private ist, kannst du es nicht von außen aufrufen. Wäre isbn public, wären die beiden Zeilen identisch.
-
kantaki schrieb:
was ich mir denke ist das der wert von total auf isbn gezeigt wird und trans auf isbn gezeigt wird. dann bräuchte man nur ein var zu deklarieren.
Genau genommen sind an der gesamten Aktion zwei Objekte beteiligt - total und trans (die wurden irgendwo in der umliegenden Funktion angelegt). Wenn du jetzt deine Methode per
total.same_isbn(trans)aufrufst, wird this (ein implizit mit übergebener Parameter für Klassenmethoden) mit der Adresse von total und rhs mit einem Verweis auf trans initialsiert, das heißt per *this und rhs erreichst du deine beiden Objekte nur unter einem anderen Namen (die "echten" Namen kannst du in der Methode idR nicht verwenden - aber genau dafür gibt es ja Parameter).
isbn ist ein Element der Klasse, das heißt jedes deiner Objekte besitzt ein eigenes Teilobjekt mit diesem Namen, die du im aufrufenden Code per "total.isbn" bzw. "trans.isbn" nutzen könntest (wenn es nicht privat wäre) und innerhalb der Methode über this->isbn (da der Name eindeutig ist, ist die reine Angabe isbn hier äquivalent dazu) bzw. rhs.isbn erreichst.(den Rest hast du womöglich unglücklich formuliert, aber ich denke mal du meintest das richtige)