2013-07-20 5 views
7
try 
{  
    if (isfull()==1) 
     throw "full stack"; 
    else 
     a[top++] = x; 
} 
catch (const char *s) 
{ 
    cout<<s; 
} 

Perché dovremmo usare const nel blocco catch? Se io non lo uso, ottengo questo errore:Perché dovrei usare "const" nel mio blocco catch?

terminate called after throwing an instance of 'char const*' 
Aborted (core dumped) 

risposta

8

Perché si sta gettando una stringa letterale, e una stringa letterale è lo stesso di un puntatore alla memoria costante, da qui la necessità di const.

2

Il blocco try genera una stringa di tipo const: "full stack", che non è destinata a essere modificata nel blocco catch.

In ogni caso, const char * non può essere convertito implicitamente in char *.

Se il parametro catch char * s, il contenuto che punta a potrebbe essere modificato dall'assegnazione s [...], che non è accettabile, causa che il contenuto ("stack completo") è costante.

6

Più in generale, è perché il blocco di cattura non sta rilevando l'eccezione che stai lanciando, se si lascia fuori il const.

Tuttavia, il lancio di un tipo non di eccezione è considerato non valido; considerare di lanciare un std::runtime_error o altro tipo derivato da std :: exception. È possibile costruirne la maggior parte con una stringa e ottenere il messaggio dalla proprietà what().

Si dovrebbe comunque prendere questi con riferimento const, per impedire la copia e modificare l'oggetto catturato (che non è una cosa utile, in ogni caso):

try 
{ 
    throw runtime_error("full stack"); 
} 
catch(const runtime_error & x) 
{ 
    cout << x.what(); 
} 
catch(const exception & x) 
{ 
    // catch other exceptions derived from this base class. 
} 
2

Perché si può implicitamente assegnare una variabile di meno qualificazione a più qualificatore Ma non puoi implicitamente assegna una variabile di mORE qualificazione a meno di qualificazione

ad esempio

foo(char * p) 
fooc(const char * p) 

int main(int argc, char agrv[]) { 
    const char* cp = "hello"; 
    char* p = new char[10]; 
    foo(cp); // ==> compilation error 
    strcpy(p, cp); 
    fooc(p) // No probs assigning to a more qualified var 
} 

Ecco perché @Joachim Pileborg ha ragione :)

0

Non è così semplice. La domanda sta mostrando qualcosa in C++. possiamo assegnare "char const *" letterale "char *"

char* ss = "full stack"; //ok, although "full stack" looks like a const char* 

const char* s2 = "full stack"; 
char* ss = s2 ; //not ok 

per prendersi cura di programma C, C++ consentono: char * ss = "stack completo"; a proposito. Nel mio compilatore VS2005, nulla è accaduto (nessun compromesso).

void main(){ 

    try 
    {  
     throw "full stack"; 
    } 
    catch (char *s) 
    { 
     std::cout << s <<std::endl; 
    } 
}