const ou "pas const"

const ou "pas const" - C++ - Programmation

Marsh Posté le 08-12-2006 à 20:33:32    

Bonjour à tous
Je débute en C++. J'ai parcouru rapidement les post traitant de "const" mais il me reste un doute sur ma façon de programmer
Il m'arrive parfois d'écrire une fonction qui va traiter un truc. Pour l'exemple, on va dire "une chaîne". Donc ma fonction traite ma chaîne pour trouver qq chose et renvoie un pointeur sur l'endroit où se trouve ce qqchose (style "strstr" par exemple)
 
La fonction renvoyant un pointeur est déclarée "char*". De plus, la fonction ne modifiant pas la chaîne reçue ne paramètre, je déclare le paramètre "const char *", style

char *traitement (const char* chaine)
{
    const char* pt;        // Ptr de balayge de ma chaîne - L'élément pointé ne sera pas modifié donc "*pt" est déclaré "const"
    pt=chaine;
    <.... traitement long et complexe mais au final pt a la valeur qui m'intéresse ...>
    return pt;
}


 
Problème: Ma fonction est "char*" et non "const char*". Normal, elle me renvoie un truc qui lui, sera suceptible d'être modifié par l'appelant. Or, "pt" est un "const char*" le compilo râle.
Ok, je fais un cast => return (char*) pt
 
Question: Etant donné que généralement un cast traduit un problème de conception, ai-je mal conçu ma fonction ? Pourtant tout me parait cohérent. La fonction ne modifiant pas les éléments pointés, je les déclare en "const"...
 
J'espère avoir été clair.


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 08-12-2006 à 20:33:32   

Reply

Marsh Posté le 08-12-2006 à 21:13:06    

Citation :

Je débute en C++. J'ai parcouru rapidement les post traitant de "const"


Note que const est aussi C99, mais avec une sémantique parfois différente.
 

Citation :

La fonction renvoyant un pointeur est déclarée "char*". De plus, la fonction ne modifiant pas la chaîne reçue ne paramètre, je déclare le paramètre "const char *", style

char *traitement (const char* chaine)
{
    const char* pt;        // Ptr de balayge de ma chaîne - L'élément pointé ne sera pas modifié donc "*pt" est déclaré "const"
    pt=chaine;
    <.... traitement long et complexe mais au final pt a la valeur qui m'intéresse ...>
    return pt;
}


 
Problème: Ma fonction est "char*" et non "const char*". Normal, elle me renvoie un truc qui lui, sera suceptible d'être modifié par l'appelant. Or, "pt" est un "const char*" le compilo râle.
Ok, je fais un cast => return (char*) pt


 
Tu fais pt=chaine; Si tu renvoies ce pointeur en cassant la "constness", tu brises le contrat que s'efforce de réaliser le compilateur, à savoir conserver "chaine" constante
 

Citation :

Question: Etant donné que généralement un cast traduit un problème de conception, ai-je mal conçu ma fonction ? Pourtant tout me parait cohérent. La fonction ne modifiant pas les éléments pointés, je les déclare en "const"...


Soit tu renvoies char const*, soit tu fais une copie de la chaine, et tu la renvoie à l'appelant.
 
utiliser std::string est largement moins complexe ;)

Message cité 1 fois
Message édité par ++fab le 08-12-2006 à 22:57:33
Reply

Marsh Posté le 09-12-2006 à 10:45:41    

++fab a écrit :

Citation :

Je débute en C++. J'ai parcouru rapidement les post traitant de "const"


Note que const est aussi C99, mais avec une sémantique parfois différente.


const est aussi ANSI-C. La plus grosse différence est que en C++ avec
static const int N = 42;
 
on obtient une constante littérale, qui peut servir de taille de tableau ou d'argument de template par exemple. En C ça reste une variable const.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed