C ++ - Perché la funzione membro statica non può essere creata con il qualificatore "const"


87

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?


1
Cosa constsignificherebbe per te una funzione membro statica?
GManNickG

2
@GMan intendo dire che una funzione membro statica che non cambia mai nessuno dei suoi input.
prabhakaran

11
Quindi i tuoi input (parametri di funzione) dovrebbero essere per valore o riferimenti costanti.
GManNickG

4
In ogni caso, non influisce sulla costanza degli argomenti delle funzioni membro. Non significa "crea tutto const", significa "crea questo const".
UncleBens

@GMan stai dicendo che const deve essere aggiunto agli argomenti
prabhakaran

Risposte:


139

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.


Significa che 'const' è solo per variabili come int, pointer, ecc.?
prabhakaran

@prabhakaran - Anche le funzioni membro possono essere qualificate const . James lo ha chiaramente menzionato nella sua risposta.
Mahesh

Anche il qualificatore const della funzione membro di @Mahesh qualifica solo "questo puntatore", non l'intero. È comunque possibile modificare la variabile globale all'interno della funzione membro qualificato const. Ora ho controllato solo questo.
prabhakaran

5
-1 "Una funzione membro statico non ha un puntatore this ... quindi la qualificazione const di una funzione membro statico non ha alcun senso [in questo modo]" è vera in sé ma è sbagliata come risposta alla domanda "perché ". In risposta si presume che il significato di 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.
Saluti e salute. - Alf

2
È C const*o const C*?
crisron

24

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!


8
Probabilmente lo stesso del motivo per cui non è possibile modificare una funzione libera per indicare "questa funzione non modifica alcuna variabile globale". 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.
Steve Jessop

1
Il 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.
Ruud Althuizen

0

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.


2
"può o non può"? Una funzione membro statica non ha mai un 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)
Ben Voigt

0

È 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

0

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.