Oggi ho un problema. Ho bisogno di una static
funzione membro, const
non è un must ma una migliore. Ma non sono riuscito nei miei sforzi. Qualcuno può dire perché o come?
Oggi ho un problema. Ho bisogno di una static
funzione membro, const
non è un must ma una migliore. Ma non sono riuscito nei miei sforzi. Qualcuno può dire perché o come?
Risposte:
Quando si applica il const
qualificatore a una funzione membro non statico, influisce sul this
puntatore. Per una funzione membro qualificata const di classe C
, il this
puntatore è di tipo C const*
, mentre per una funzione membro che non è qualificata const, il this
puntatore è di tipo C*
.
Una funzione membro statico non ha un this
puntatore (tale funzione non viene chiamata su una particolare istanza di una classe), quindi la qualificazione const di una funzione membro statica non ha alcun senso.
const
dovrebbe essere lo stesso per un membro statico come per uno non statico. Come esempio che quel pensiero non regge, considera il significato di static
, che dipende dal contesto.
C const*
o const C*
?
Sono d'accordo con la tua domanda, ma sfortunatamente il C ++ è progettato in questo modo. Per esempio:
class A {
int i; //<--- accessed with 'this'
static int s; //<---- accessed without 'this'
public:
static void foo () const // <-- imaginary const
{}
};
Ad oggi, il const
è considerato nel contesto di this
. In un certo senso, è stretto. Può essere ampliato applicandolo const
oltre il this
puntatore.
vale a dire il "proposto" const
, che può anche applicarsi alle static
funzioni, limiterà i static
membri da qualsiasi modifica.
Nel codice di esempio, se foo()
può essere creato const
, in quella funzione A::s
non può essere modificato. Non riesco a vedere alcun effetto collaterale della lingua, se questa regola viene aggiunta allo standard. Al contrario, è divertente il motivo per cui tale regola non esiste!
const
si applica a un oggetto (nel caso delle funzioni membro const, l'istanza su cui viene chiamato). Se vuoi che si applichi a tutti i membri statici della classe, immagino che se fosse considerato dal comitato, allora non si pensava fosse un requisito abbastanza comune da supportare.
const
modificatore non viene applicato ai metodi membro o alle variabili membro, ma al this
puntatore implicito . Poiché un metodo membro statico non è associato a un oggetto, non è this
necessario creare alcun puntatore const
.
Senza entrare nei dettagli, è perché potrebbe esserci o meno un oggetto modificato dalla funzione, quindi const è ambiguo per il compilatore.
Ricorda che const
mantiene gli oggetti costanti, ma potrebbe esserci o meno un oggetto da mantenere costanti.
this
puntatore. (Inoltre, const
non mantiene gli oggetti costanti. Impedisce l'utilizzo di un puntatore o riferimento particolare per modificare l'oggetto, ma la modifica potrebbe comunque avvenire attraverso un altro percorso)
È un peccato che C ++ non lo accetti come da progettazione, ma logicamente ci sono pochi casi d'uso in cui si convalida bene.
Una funzione che è valida a livello di classe (statica) potrebbe non modificare alcun dato statico, potrebbe essere che i dati della query dovrebbero essere const. Potrebbe essere dovrebbe essere come
if(Object)
MakeThisConstant()
else
MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios
Una "funzione membro const" non può modificare l'oggetto su cui è chiamata, ma le funzioni membro statiche non vengono chiamate su alcun oggetto. Viene utilizzato direttamente dall'operatore di risoluzione dell'ambito. Quindi avere una funzione membro statico const non ha senso, quindi è illegale.
const
significherebbe per te una funzione membro statica?