<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Friend-Funktion</id>
	<title>Friend-Funktion - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Friend-Funktion"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Friend-Funktion&amp;action=history"/>
	<updated>2026-05-28T14:38:56Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Friend-Funktion&amp;diff=2328609&amp;oldid=prev</id>
		<title>imported&gt;Thomas Dresler: Kommasetzung</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Friend-Funktion&amp;diff=2328609&amp;oldid=prev"/>
		<updated>2023-04-24T18:49:10Z</updated>

		<summary type="html">&lt;p&gt;Kommasetzung&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Unter einer &amp;#039;&amp;#039;&amp;#039;Friend-Funktion&amp;#039;&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;&amp;#039;Friend-Methode&amp;#039;&amp;#039;&amp;#039; versteht man in der [[Objektorientierte Programmierung|objektorientierten Programmierung]] eine  [[Methode (Programmierung)|Methode]], [[Funktion (Programmierung)|Funktion]] oder [[Prozedur (Programmierung)|Prozedur]], der man erlaubt, auf private (&amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;private&amp;lt;/span&amp;gt;) oder geschützte (&amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;protected&amp;lt;/span&amp;gt;) [[Daten]] einer anderen [[Klasse (Objektorientierung)|Klasse]] zuzugreifen, auf die sie sonst keinen Zugriff hätte.&lt;br /&gt;
&lt;br /&gt;
Ein solcher Zugriff widerspricht dem [[Paradigma]] der [[Datenkapselung (Programmierung)|Datenkapselung]], kann aber unter Umständen trotzdem sinnvoll sein. Dann wird die zugreifende Methode mit dem Schlüsselwort &amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;friend&amp;lt;/span&amp;gt; als ein „Freund“ der darauf zugegriffenen Klasse deklariert. Sie hat dann nicht nur auf öffentliche (&amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;public&amp;lt;/span&amp;gt;), sondern auch auf geschützte (&amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;protected&amp;lt;/span&amp;gt;) oder private (&amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;private&amp;lt;/span&amp;gt;) Informationen in dieser Klasse Zugriff.&lt;br /&gt;
&lt;br /&gt;
Diese Möglichkeit der Freundschaft sollte mit Bedacht genutzt werden, da dadurch die Datenkapselung abgeschwächt wird.&lt;br /&gt;
Friend-Methoden sind ein Konzept der Programmiersprache [[C++]]. Jedoch gibt es ähnliche Möglichkeiten in anderen objektorientierten Programmiersprachen (zum Beispiel [[Sprachelemente von C-Sharp#Zugriffsmodifikatoren|internal]] in [[C-Sharp|C#]]).&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Beispiel 1&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
In diesem C++-Beispiel ist die Funktion &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt; ein Freund der Klasse &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt;. Sie kann deshalb auf das mit &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt; geschützte Attribut &amp;lt;code&amp;gt;wert&amp;lt;/code&amp;gt; dieser Klasse zugreifen. Wäre &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt; nicht als Freund deklariert, wäre ein Zugriff auf das private Attribut nicht möglich und das Programm könnte auch nicht übersetzt werden.&lt;br /&gt;
&lt;br /&gt;
Eine in der Praxis vorzuziehende Lösung wäre in diesem Beispiel eine [[Zugriffsfunktion]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class A {&lt;br /&gt;
private:&lt;br /&gt;
   int wert;&lt;br /&gt;
public:&lt;br /&gt;
   A() : wert(42) {}&lt;br /&gt;
   friend int main();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
   A a;&lt;br /&gt;
&lt;br /&gt;
   std::cout &amp;lt;&amp;lt; &amp;quot;A::wert = &amp;quot; &amp;lt;&amp;lt; a.wert &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;#039;&amp;#039;&amp;#039;Beispiel 2&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
In C++ können Operatoren überladen werden. So z.&amp;amp;nbsp;B. auch bei der Ausgabeoperator &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt;(ursprünglich [[logische Verschiebung]]).  Wenn man eigene Datentypen implementiert, kann man durch [[Überladen]] dieses Operators die Ausgabe steuern. Dafür wird häufig der Zugriff auf private Member erfordert, die normalerweise für den Operator &amp;lt;code&amp;gt;&amp;lt;&amp;lt;&amp;lt;/code&amp;gt; nicht zugänglich sind.&lt;br /&gt;
&lt;br /&gt;
Indem man den global überladenen Operator mit &amp;lt;code&amp;gt;friend&amp;lt;/code&amp;gt; kennzeichnet, können jedoch auch private [[Attribut (Programmierung)|Attribute]] ausgegeben werden:&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Zahl {&lt;br /&gt;
private:&lt;br /&gt;
    int m_zahl{20};&lt;br /&gt;
public:&lt;br /&gt;
    Zahl(){};&lt;br /&gt;
    Zahl(int zahl) : m_zahl(zahl){}&lt;br /&gt;
&lt;br /&gt;
    friend ostream&amp;amp; operator&amp;lt;&amp;lt;(ostream &amp;amp;out, const Zahl &amp;amp;zahlObj){&lt;br /&gt;
        out &amp;lt;&amp;lt; &amp;quot;Zahl: &amp;quot; &amp;lt;&amp;lt; zahlObj.m_zahl;&lt;br /&gt;
        return out;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    Zahl zahl{5}&lt;br /&gt;
    cout &amp;lt;&amp;lt; zahl &amp;lt;&amp;lt; endl; //Ausgabe: Zahl: 5&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Es ist zu beachten, dass, obwohl dieser Operator innerhalb der Klasse &amp;#039;&amp;#039;&amp;lt;code&amp;gt;Zahl&amp;lt;/code&amp;gt;&amp;#039;&amp;#039; definiert ist, er eine freie Funktion darstellt, d.&amp;amp;nbsp;h. &amp;#039;&amp;#039;keine Memberfunktion&amp;#039;&amp;#039; der Klasse &amp;lt;code&amp;gt;Zahl&amp;lt;/code&amp;gt; ist. Lässt man das Schlüsselwort &amp;lt;code&amp;gt;friend&amp;lt;/code&amp;gt; weg, so wird &amp;lt;code&amp;gt;operator&amp;lt;&amp;lt;&amp;lt;/code&amp;gt; zu einer Memberfunktion, was jedoch für dieses Beispiel zur [[Standard-Datenströme|Standardausgabe]] nicht sinnvoll wäre.&lt;br /&gt;
== Friend-Klasse ==&lt;br /&gt;
Anstelle einer Methode kann auch eine ganze [[Klasse (Objektorientierung)|Klasse]] als Freund einer anderen Klasse definiert werden. Dann kann jede Methode dieser Klasse auf alle privaten Informationen der anderen Klasse zugreifen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class A&lt;br /&gt;
{&lt;br /&gt;
    …&lt;br /&gt;
    friend class B;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class B&lt;br /&gt;
{&lt;br /&gt;
    …&lt;br /&gt;
    void changeA(A &amp;amp;a) { a.a = b; }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    A a(100);&lt;br /&gt;
    B b(200);&lt;br /&gt;
    a.show(); // Gibt &amp;quot;a = 100&amp;quot; aus&lt;br /&gt;
    b.show(); // Gibt &amp;quot;b = 200&amp;quot; aus&lt;br /&gt;
    b.changeA(a);&lt;br /&gt;
    a.show(); // Gibt &amp;quot;a = 200&amp;quot; aus&lt;br /&gt;
    b.show(); // Gibt &amp;quot;b = 200&amp;quot; aus&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* [[Bjarne Stroustrup]]: &amp;#039;&amp;#039;The C++ Programmierung Language&amp;#039;&amp;#039;. ISBN 978-0-201-88954-3.&lt;br /&gt;
* Graham M. Seed: &amp;#039;&amp;#039;An Introduction to Object-Oriented Programmierung in C++&amp;#039;&amp;#039;. ISBN 978-1-85233-450-5.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.codersource.net/C/CTutorials/CTutorialfriend.aspx C++ friend function tutorial] bei CoderSource.net&lt;br /&gt;
* [http://www.cplusplus.com/doc/tutorial/inheritance.html C++ friendship and inheritance tutorial] bei cplusplus.com&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Objektorientierte Programmierung]]&lt;br /&gt;
[[Kategorie:Unterprogramm]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Thomas Dresler</name></author>
	</entry>
</feed>