Oggi ho un problema. Ho bisogno di una staticfunzione membro, constnon è 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 staticfunzione membro, constnon è un must ma una migliore. Ma non sono riuscito nei miei sforzi. Qualcuno può dire perché o come?
Risposte:
Quando si applica il constqualificatore a una funzione membro non statico, influisce sul thispuntatore. Per una funzione membro qualificata const di classe C, il thispuntatore è di tipo C const*, mentre per una funzione membro che non è qualificata const, il thispuntatore è di tipo C*.
Una funzione membro statico non ha un thispuntatore (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.
constdovrebbe 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 constoltre il thispuntatore.
vale a dire il "proposto" const, che può anche applicarsi alle staticfunzioni, limiterà i staticmembri da qualsiasi modifica.
Nel codice di esempio, se foo()può essere creato const, in quella funzione A::snon 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!
constsi 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.
constmodificatore non viene applicato ai metodi membro o alle variabili membro, ma al thispuntatore implicito . Poiché un metodo membro statico non è associato a un oggetto, non è thisnecessario 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 constmantiene gli oggetti costanti, ma potrebbe esserci o meno un oggetto da mantenere costanti.
thispuntatore. (Inoltre, constnon 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.
constsignificherebbe per te una funzione membro statica?