2011-08-30 3 views
8

Ho codice come questo ...Perché abbiamo bisogno di inserire const alla fine dell'intestazione della funzione, ma in un primo momento statico?

class Time 
{ 
    public: 
     Time(int, int, int); 
     void set_hours(int); 
     void set_minutes(int); 
     void set_seconds(int); 

     int get_hours() const; 
     int get_minutes() const; 
     int get_seconds() const; 

     static void fun() ; 

     void printu() const; 
     void prints(); 

    private: 
     int x; 
     int hours; 
     int minutes; 
     int seconds; 
     const int i; 
}; 

Perché devo mettere const finalmente di fare un tipo costante funzione, ma se ho bisogno di fare una funzione, che può fare questo tipo ...

static void Time::fun() 
{ 
    cout<<"hello"; 
} 

Sopra la funzione fun() è anche nella stessa classe. Voglio solo sapere qual è la ragione di questo?

+1

So perché 'const' non può andare in primo piano. Non so perché 'static' non può andare alla fine ... – Beta

risposta

10

con un metodo istanza const come int get_hours() const;, il const significa che la definizione di int get_hours() const; non modificherà this.

con un metodo statico come static void fun();, const non si applica perché this non è disponibile.

è possibile accedere a un metodo statico dalla classe o dall'istanza a causa della sua visibilità. più specificamente, non è possibile chiamare i metodi di istanza o accedere alle variabili di istanza (ad esempio , hours) dal metodo statico perché non esiste un'istanza.

class t_classname { 
public: 
    static void S() { this->x = 1; } // << error. this is not available in static method 
    void s() { this->x = 1; } // << ok 
    void t() const { this->x = 1; } // << error. cannot change state in const method 
    static void U() { t_classname a; a.x = 1; } // << ok to create an instance and use it in a static method 
    void v() const { S(); U(); } // << ok. static method is visible to this and does not mutate this. 

private: 
    int a; 
}; 
+0

** questo ** non è disponibile nelle funzioni statiche, ma siamo ancora in grado di accedere al divertimento statico usando un oggetto come? – teacher

+0

@teacher aggiornato – justin

2

È perché che se si mette il const prima vorrebbe dire che si sta tornando una cosa const dalla funzione - vale a dire un significato diverso che la funzione è const

+1

perché non possiamo mettere la statica alla fine? qualche idea? – teacher

+0

È solo sintassi. – Marlon

4

Quando si inserisce const all'inizio, si stai applicando al tipo di ritorno. Non importa se si restituisce il tipo in caso di annullamento, ma si dice che si sta restituendo char* che non è const. Se si mette const all'inizio, che ci si finisce con

static const char* MyFunction() { ... } 

che mi dice che il tipo di ritorno è un const char*, non una funzione const che restituisce un char*.

Mettendolo alla fine evita questo problema.

9

Il const alla fine significa che la funzione è costante, quindi non modifica lo stato dell'oggetto.

Quando si inserisce const alla fine, non è possibile modificare lo stato dei membri dell'oggetto.

Dichiarare una funzione statica significa che non appartiene affatto all'oggetto, appartiene al tipo di classe.

Inserire const all'inizio significa che il valore del tipo restituito è una costante.

+0

Mettere mezzi statici alla fine? – ProgramCpp

+0

@ProgramCpp Significa che non verrà compilato. –

0

uno e l'altro è spiegato un po 'più in dettaglio here. Mettere const dopo una dichiarazione di funzione rende la funzione costante, nel senso che non può modificare nulla nell'oggetto che contiene la funzione.

0

È un problema puramente grammaticale. const è un cv-qualifier e, se applicato a una funzione membro, deve essere inserito dopo le dichiarazioni dei parametri.Si è tentato di posizionarlo prima del nome della funzione che potrebbe essere interpretato solo come qualificante per il tipo di ritorno della funzione.

static, d'altra parte, è un identificatore di classe di memoria e deve apparire prima del dichiaratore a cui si applica.

Queste regole derivano semplicemente dal modo in cui è definita la grammatica C++.

Problemi correlati