C++
Gebruik aangifte
Zoeken…
Invoering
Een using
verklaring introduceert een enkele naam in de huidige scope die eerder elders werd gedeclareerd.
Syntaxis
- gebruik typenaam ( opt ) geneste-naam-specificeerder niet-gekwalificeerde-id ;
- using :: unqualified-id ;
Opmerkingen
Een gebruikende-verklaring verschilt van een gebruikende instructie , die de compiler vertelt om in een bepaalde naamruimte te zoeken bij het opzoeken van een naam. Een gebruiksrichtlijn begint met het using namespace
.
Een gebruikende-verklaring verschilt ook van een aliasdeclaratie, die een nieuwe naam geeft aan een bestaand type op dezelfde manier als typedef
. Een aliasverklaring bevat een is-gelijkteken.
Namen afzonderlijk importeren vanuit een naamruimte
Nadat using
is gebruikt om de naam cout
uit de naamruimte std
in het bereik van de main
te introduceren, kan het std::cout
object alleen worden aangeduid als cout
.
#include <iostream>
int main() {
using std::cout;
cout << "Hello, world!\n";
}
Leden opnieuw opgeven uit een basisklasse om te voorkomen dat namen worden verborgen
Als er een gebruikendeclaratie voorkomt bij klassebereik, is het alleen toegestaan om een lid van een basisklasse opnieuw te declareren. Het using std::cout
is bijvoorbeeld niet toegestaan in het klassenbereik.
Vaak is de naam die opnieuw is opgegeven, anders verborgen. In de onderstaande code verwijst d1.foo
alleen naar Derived1::foo(const char*)
en treedt een compilatiefout op. De functie Base::foo(int)
is verborgen en wordt helemaal niet beschouwd. d2.foo(42)
is echter prima omdat de gebruikende-verklaring Base::foo(int)
in de verzameling entiteiten met de naam foo
in Derived2
. Naam opzoeken vindt dan zowel foo
s als de overbelastingsresolutie selecteert Base::foo
.
struct Base {
void foo(int);
};
struct Derived1 : Base {
void foo(const char*);
};
struct Derived2 : Base {
using Base::foo;
void foo(const char*);
};
int main() {
Derived1 d1;
d1.foo(42); // error
Derived2 d2;
d2.foo(42); // OK
}
Overnemende constructeurs
Als een speciaal geval kan een gebruikendeclaratie op klassebereik verwijzen naar de constructeurs van een directe basisklasse. Die constructors worden vervolgens geërfd door de afgeleide klasse en kunnen worden gebruikt om de afgeleide klasse te initialiseren.
struct Base {
Base(int x, const char* s);
};
struct Derived1 : Base {
Derived1(int x, const char* s) : Base(x, s) {}
};
struct Derived2 : Base {
using Base::Base;
};
int main() {
Derived1 d1(42, "Hello, world");
Derived2 d2(42, "Hello, world");
}
In de bovenstaande code hebben zowel Derived1
als Derived2
constructors die de argumenten rechtstreeks doorsturen naar de overeenkomstige constructor van Base
. Derived1
voert de forwarding expliciet uit, terwijl Derived2
, met behulp van de C ++ 11-functie van overnemende constructeurs, dit impliciet doet.