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

C ++ 11

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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow