Längere Diskussion dieses hier: Why do objects of the same class have access to each other's private data?C++ Verweis auf dieselbe Klasse Exposes Private Members
Einfaches Beispiel unter Verwendung Linie mit einer ganzen Zahl Länge Objekte. Die Überladungsfunktion operator+
hat Zugriff auf die private Länge der anderen Zeile (der Parameter const Line &line
, auch bekannt als die Zeile, die der Zeile this
hinzugefügt wird). Dasselbe gilt für eine Nicht-Operator-Überlastfunktion (printOtherLine
) und eine Friend-Funktion (printFriendLine
). Die als Parameter übergebene Linie ist wiederum nicht this
Objekt.
Warum ist das der Fall?
#include <iostream>
class Line
{
public:
Line()
{
length = 0;
}
Line(int length)
{
this->length = length;
}
Line operator+(const Line &line)
{
Line newLine(this->length + line.length); // I would have thought
// this would be line.getLength()
// instead of line.length
return newLine;
}
int getLength()
{
return length;
}
void printOtherLine(const Line &otherLine){
std::cout << "Other Line: " << otherLine.length << std::endl;
}
void printLine(int lineNumber){
std::cout << "Line " << lineNumber << ": " << this->length << std::endl;
}
friend void printFriendLine(const Line &friendlyLine);
private:
int length;
};
void printFriendLine(const Line &friendlyLine){
std::cout << "Friendly Line: " << friendlyLine.length << std::endl;
}
// This function will not compile
// void printUnassociatedLine(const Line &line){
// std::cout << "Unassociated Line: " << line.length << std::endl;
// }
int main()
{
Line l1(10);
l1.printLine(1);
Line l2(15);
l2.printLine(2);
Line l3 = l1 + l2;
l3.printLine(3);
Line l4(7);
l3.printOtherLine(l4);
printFriendLine(l4);
return 0;
}
Ausgang:
Line 1: 10
Line 2: 15
Line 3: 25
Other Line: 7
Friendly Line: 7
Hat die Frage, auf die Sie jetzt im Update verlinkt sind, Ihre Frage beantwortet? Wenn ja, schließe ich das für dich. Oder du kannst es löschen, wenn meine Antwort nicht mehr bietet, als du dort gefunden hast. –