2009-06-15 12 views

risposta

90

Credo che si intende

Perché const implica il collegamento interno in C++

E 'vero che se si dichiara un oggetto const a perimetro dello spazio dei nomi, allora ha il collegamento interno.

Appendice C fornisce il razionale

Cambio: Un nome di ambito di file che viene dichiarato in modo esplicito const, e non dichiarato esplicitamente esterno, ha il collegamento interno, mentre in C avrebbe collegamento esterno

Motivazione: Poiché gli oggetti const possono essere utilizzati come valori di compilazione in C++, questa funzione sollecita i programmatori a fornire valori di inizializzazione espliciti per ogni const. Questa funzione consente all'utente di inserire oggetti const nei file di intestazione che sono inclusi in molte unità di compilazione.

+0

Il razionale aiuta a spiegare perfettamente. – FaceBro

+0

Sembra che anche gli oggetti globali non const possano essere inizializzati, ma perché lo standard non gli fornisce il collegamento interno? –

-3

Non funziona. Scrivere il seguente:

const int i = 0; 

non fa i statica (in C o C++).

3

Questi concetti sono ortogonali e non dovrebbero essere pensati come la stessa cosa.

La costanza è una proprietà di accesso: indica solo se la variabile deve essere di sola lettura (const) o write-read (non-const).

La staticità è una proprietà di durata di vita (e tecnicamente di localizzazione della memoria): indica se la variabile sarà globale nell'ambito di una classe (quando in una classe) o di una unità di traduzione (se utilizzata con una variabile globale definita in un cpp).

-1

Non lo fa, e l'esempio più ovvio è che se si ha una variabile membro const (che è inizializzata dal costruttore, ovviamente), non è condivisa da tutti gli oggetti di quella classe, ma individuale a ogni.

class A { 
public: 
    A(int newx) : x(newx); 
private 
    int x; 
} 

litb fornisce la risposta migliore, sopra.

+0

Non lo fa sempre? (Litb) – RastaJedi

6

In C & C++ il termine statica ha molteplici significati (si può governare il collegamento e lo stoccaggio) Dovrete leggere D di Stroustrup & E per apprezzare la sua logica - ma quando si dichiara una variabile di essere const a perimetro dello spazio dei nomi ha automaticamente il collegamento interno - mentre in C devi dichiararlo statico per forzarlo ad avere un collegamento interno.

Ovviamente in C++, l'uso del collegamento statico a controllo è stato deprecato, gli spazi dei nomi anonimi possono essere utilizzati per simulare il collegamento interno in C++.

le variabili const in C++ dovevano sostituire le costanti del preprocessore - e poiché le costanti del preprocessore sono visibili solo nei file che le definiscono, allo stesso modo, const rende automaticamente la variabile visibile solo nel file che la definisce.

9

Come diceva litb, gli oggetti const hanno un collegamento interno. Questo perché sono destinati ad essere usati in questo modo:

// a.cpp 
const int BUFSIZE = 100; 
char abuf[BUFSIZE]; 

// b.cpp 
const int BUFSIZE = 256 
int bbuf[BUFSIZE]; 
4

Const e static sono concetti ortogonali sia in C che in C++.

La parola chiave const dice al compilatore di impedire alla variabile di apparire come lvalue di qualsiasi espressione, essenzialmente rendendola di sola lettura.

In C, la parola chiave static ha diversi usi a seconda di cosa viene applicata. Quando applicato a una variabile di una funzione, indica che la variabile non è memorizzata nello scope locale di una funzione, ma è accessibile attraverso invocazioni di essa. Quando viene applicato a una variabile o funzione globale, diventa accessibile solo a un determinato file - in altre parole, è accessibile solo all'interno dell'unità di compilazione (a meno che non sia dichiarato extern).

In C++, la parola static può essere utilizzato all'interno di una definizione di classe, per fare una variabile o funzioni condivisi in tutte le istanze della classe, piuttosto che essere locale per ogni istanza. Inoltre, una funzione di classe statica in C++ può solo accedere a variabili statiche di quella classe (o classi a cui ha accesso). Ora, in C++, const fornisce ai membri il collegamento interno all'unità di compilazione, a meno che non vengano dichiarati esplicitamente extern - questo potrebbe essere ciò a cui si sta riferendo. Ciò consente di condividere le costanti in fase di compilazione attraverso l'unità tramite l'uso di file di intestazione. Tieni presente, tuttavia, che i membri non sono realmente statici, piuttosto che la costante è compilata in in ciascuna posizione a cui viene fatto riferimento.

Problemi correlati