C++: Was genau macht 'using'?

OP (Firma: RUB) #5300616
Lesenswert?
• ▲
▼
Hallo Forum,

aufgrund anderer Beitraege hier moechte ich mich gerade mal etwas mehr 
mit C++ und dem Keyword using beschaeftigen.

In diesem Beitrag:
Beitrag "Re: C++ Sinn von dieser Codeabschnitt"

wird z.B. folgendes Vorgeschlagen:
1
using ptr = int*;

Wenn ich das using erstmal weglasse, und folgenden Code habe:
1
int* a, b;
In diesem Beispiel ist nur a ein Pointer, aber nicht b.

Nutze ich aber using
1
using ptr = int*;
2

3
ptr a, b;
So sind sowohl a als auch b Pointer.

using hat fuer mich damit einen echten Mehrwert. Aber was genau 
passiert da? Es scheint ja doch mehr als nur ein Alias zu sein. Waere 
es nur ein Alias, duerfte in dem using -Beispiel die Variable b kein 
Pointer sein.

Mag mir wer von Euch erklaeren,
a) was da passiert und
b) wie genau das Funktioniert?

Ich wuerde es gerne verstehen.

Gruesse
Moderator Persönliche Seite #5300629
Lesenswert?
• ▲
▼
Kaj G. schrieb:
> Waere es nur ein Alias, duerfte in dem using -Beispiel die Variable b
> kein Pointer sein.

Doch, sicher.  Auch bei typedef konnte man einen Zeigertyp vereinbaren.

Was du meinst ist, wenn man nur eine Textersetzung durch den
Präprozessor hätte machen lassen.
1
#define PTR int*
2

3
PTR a, b;

Sollte man daher natürlich auch auf keinen Fall so schreiben.  Daher
ist es in C ja auch sehr viel üblicher, dass man den Stern an den
Namen klebt, zu dem er gehört, also:
1
int *a, b;
#5300675
Lesenswert?
• ▲
▼
"using" steht In C++ Doku unter dem Begriff "type alias". Also ein 
anderer (kürzerer) Name für einen Typ. Klingt nach typedef, nur kann 
using auch Template Types benennen, z.B.:
1
template<size_t N>
2
using char_array_t = std::array<char,N>;
3

4
char_array_t<10> char10;
5
char_array_t<20> char20;

using ist somit eine Art generalisiertes typedef.

BTW, Fragen zu C++ kann man hier (risikoarm) vorklären:
http://en.cppreference.com/
Persönliche Seite #5300722
Lesenswert?
• ▲
▼
Jörg W. schrieb:
> Doch, sicher.  Auch bei typedef konnte man einen Zeigertyp vereinbaren.

Und so sieht das aus:
1
typedef int *ptr;
Hat exakt den gleichen Effekt wie
1
using ptr = int*;
d.h. bei
1
ptr a, b;
sind auf jeden Fall a und b beide Zeiger. Was ich im Original-Thread 
sagen wollte, ist dass ich die "using" Variante intuitiver finde.
Bei
1
int *a, b;
Ist nur a ein Zeiger, weil das * hier zum Variablennamen (a) gehört, 
und nicht zum Typ, welcher für beide Variablen gilt. Wenn aber der Typ 
bereits ein Zeiger ist (wie ptr), sind danach beides Zeiger.

Die C-Syntax ist zwar weder schön noch intuitiv, aber unlogisch ist sie 
nicht ;-)
OP (Firma: RUB) #5300790
Lesenswert?
• ▲
▼
Niklas G. schrieb:
> Was ich im Original-Thread
> sagen wollte
Darum ging es mir gar nicht. :-)
Aber das war der Stein des Anstosses fuer mich, mich mal etwas naeher 
mit den Vorzuegen von C++ zu beschaeftigen.

Ich werde mal noch etwas damit herum spielen.


Carl D. schrieb:
> Es ging aber nicht um jede Verwendung des Keywords "using", sondern im
> konkreten Fall um "type alias"
Na, jetzt fangt hier bitte nicht an zu streiten. Diese Verwendung war 
der Anfang, aber wenn es auch andere, gute Verwendungen fuer using 
gibt, dann darf das hier gerne mit angetragen werden. :-)


Schon mal vielen Dank fuer Eure Antworten. :o)

Gruesse
#5300875
Lesenswert?
• ▲
▼
Kaj G. schrieb:
>
> Carl D. schrieb:
>> Es ging aber nicht um jede Verwendung des Keywords "using", sondern im
>> konkreten Fall um "type alias"
> Na, jetzt fangt hier bitte nicht an zu streiten. Diese Verwendung war
> der Anfang, aber wenn es auch andere, gute Verwendungen fuer using
> gibt, dann darf das hier gerne mit angetragen werden. :-)

Streit ist was ganz anderes, wenn es hier um den dritten Buchstaben und 
den doppelten Grundrechenoperator geht.  ;-)

Wenn du mehr dazu erfahren willst, kann ich dir nur wärmstens den 
angegebenen Link empfehlen. Ist zwar etwas trocken, aber immer mit 
Beispielen, die zu Onlinecompilern verlinkt sind. Da kann man gleich 
testen.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.