Condividi tramite


Riepilogo delle regole di ambito

L'utilizzo di un nome deve essere non ambiguo all'interno dell'ambito relativo (fino al punto in cui viene determinata l'esecuzione dell'overload). Se il nome indica una funzione, quest'ultima deve essere non ambigua rispetto al numero e al tipo di parametri. Se il nome rimane non ambiguo, vengono applicate regole di accesso ai membri.

Inizializzatori del costruttore

Gli inizializzatori del costruttore vengono valutati nell'ambito del blocco più esterno del costruttore per cui sono specificati. Di conseguenza, possono usare i nomi dei parametri del costruttore.

Nomi globali

Un nome di un oggetto, funzione o enumeratore è globale se viene introdotto al di fuori di qualsiasi funzione o classe o se è preceduto dall'operatore unario di ambito globale (::) e se non viene utilizzato insieme a uno degli operatori binari seguenti:

  • Risoluzione ambito (::)

  • Selezione dei membri per oggetti e riferimenti (.)

  • Selezione dei membri per i puntatori (->)

Nomi completi

I nomi usati con l'operatore di risoluzione dell'ambito binario (::) sono denominati "nomi qualificati". Il nome specificato dopo l'operatore di risoluzione dell'ambito binario deve essere un membro della classe specificata a sinistra dell'operatore o di un membro della relativa classe base( es).

I nomi specificati dopo l'operatore member-selection (. o ->) devono essere membri del tipo di classe dell'oggetto specificato a sinistra dell'operatore o dei membri della relativa classe base( es). I nomi specificati a destra dell'operatore di selezione dei membri (->) possono anche essere oggetti di un altro tipo di classe, a condizione che il lato sinistro di -> sia un oggetto classe e che la classe definisca un operatore di selezione membro di overload (->) che restituisce un puntatore a un altro tipo di classe. (Questo provisioning è descritto in modo più dettagliato in Class Member Access.)

Il compilatore cerca i nomi nel seguente ordine, arrestandosi quando il nome viene trovato:

  1. Ambito blocco corrente se il nome è usato in una funzione; in caso contrario, ambito globale.

  2. Verso l'esterno, attraverso ogni ambito di blocco contenitore, compreso l'ambito più esterno della funzione (inclusi i parametri della funzione).

  3. Se il nome è già in una funzione membro, viene cercato l'ambito della classe per il nome.

  4. Le classi base della classe sono disponibili il nome.

  5. Vengono ricercati l'ambito di classe contenitore annidato (se presente) e le relative basi. La ricerca continua fino a trovare l'ambito più esterno della classe contenitore.

  6. Viene cercato l'ambito globale.

Tuttavia, è possibile apportare le modifiche a questo ordine di ricerca come segue:

  1. I nomi preceduti da :: forzano l'inizio della ricerca in ambito globale.

  2. I nomi preceduti dalle classparole chiave , structe union forzano il compilatore a cercare solo classnomi , structo union .

  3. I nomi sul lato sinistro dell'operatore di risoluzione dell'ambito (::) possono essere solo classnomi , struct, namespaceo union .

Se il nome riferimento a un membro non statico ma viene usato in una funzione membro statica, verrà generato un messaggio di errore. Analogamente, se il nome fa riferimento a qualsiasi membro non statico in una classe di inclusione, viene generato un messaggio di errore perché le classi racchiuse non includono puntatori di classe this .

Nomi dei parametri delle funzioni

I nomi dei parametri delle funzioni nelle definizioni di funzione sono considerati nell'ambito del blocco più esterno della funzione. Di conseguenza, sono nomi locali e diventano esterni all'ambito quando si esce dalla funzione.

I nomi dei parametri delle funzioni nelle dichiarazioni di funzione (prototipi) sono inclusi nell'ambito locale della dichiarazione e diventano esterni all'ambito alla fine della dichiarazione.

I parametri predefiniti sono inclusi nell'ambito del parametro per il quale costituiscono l'impostazione predefinita, come descritto nei due paragrafi precedenti. Tuttavia, non possono accedere alle variabili locali o ai membri di classe non statici. I parametri predefiniti vengono valutati al momento della chiamata di funzione, ma vengono valutati nell'ambito originale della dichiarazione di funzione. Di conseguenza, i parametri predefiniti per le funzioni membro vengono sempre valutati nell'ambito della classe.

Vedi anche

Ereditarietà