ben si j'en crois ce que dit le monsieur, et il a pas l'air mauvais, donc je vais le croire:
- en c++ variable string + "literal" marche uniquement parce que l'operateur + a ete surdefini (itou pour le constructeur de copie avec l'assignement).
Ca marche parce qu'un des membres de l'operation est un String et que donc c'est l'operateur redefinit qui est applique.
Par contre, si tu fais "toto"+"tata", ca va peter, parce que ni toto ni tata ne sont des string, mais bel et bien des char*.
Bref, on a un truc qui ressemble a s'y meprendre a une String, mais qui n'en est clairement pas une du tout.
- Le truc avec java (ou n'importe quel autre langage decent qui traite les chaines comme des chaines, et pas comme des tableau d'un autre type...), c'est pas qu'il utilise directement la memoire.
'fin si, il le fait, mais on s'en cogne, c'est pas la question ici.
Ce qui est interessant c'est que le literal "toto" est un objet de la classe String.
Et que donc le comportement est strictement le meme que variable + variable1.
tu peux meme faire "toto".equals(variable);
C'est meme d'ailleurs ce qui est recommande de faire (ca t'evite un check de pointeur nul si tu renverses l'expression).
Ton literal EST un objet, pas un char*. "toto".getClass te retourne String, "toto" instanceof String te retourne true etc.
Bon courage pour faire ca en c++.
Bref, le probleme de fond, c'est que le langage n'as PAS de classe String (String est visiblement dans une lib, qui meme si elle plus ou moins standard et utilisee par tout le monde, n'est pas dans le langage, donc "toto" reste un char* et ne sera jamais une instance de string).
Et pour un langage objet, qui se veut moderne, c'est pour le moins deroutant.
Je me doute que c'est pour des raisons de compat avec le C, mais ca change rien au pb...
[^] # Re: bannir "connect"
Posté par thedude . En réponse au journal Banni de chez Microsoft.. Évalué à 2.
- en c++ variable string + "literal" marche uniquement parce que l'operateur + a ete surdefini (itou pour le constructeur de copie avec l'assignement).
Ca marche parce qu'un des membres de l'operation est un String et que donc c'est l'operateur redefinit qui est applique.
Par contre, si tu fais "toto"+"tata", ca va peter, parce que ni toto ni tata ne sont des string, mais bel et bien des char*.
Bref, on a un truc qui ressemble a s'y meprendre a une String, mais qui n'en est clairement pas une du tout.
- Le truc avec java (ou n'importe quel autre langage decent qui traite les chaines comme des chaines, et pas comme des tableau d'un autre type...), c'est pas qu'il utilise directement la memoire.
'fin si, il le fait, mais on s'en cogne, c'est pas la question ici.
Ce qui est interessant c'est que le literal "toto" est un objet de la classe String.
Et que donc le comportement est strictement le meme que variable + variable1.
tu peux meme faire "toto".equals(variable);
C'est meme d'ailleurs ce qui est recommande de faire (ca t'evite un check de pointeur nul si tu renverses l'expression).
Ton literal EST un objet, pas un char*. "toto".getClass te retourne String, "toto" instanceof String te retourne true etc.
Bon courage pour faire ca en c++.
Bref, le probleme de fond, c'est que le langage n'as PAS de classe String (String est visiblement dans une lib, qui meme si elle plus ou moins standard et utilisee par tout le monde, n'est pas dans le langage, donc "toto" reste un char* et ne sera jamais une instance de string).
Et pour un langage objet, qui se veut moderne, c'est pour le moins deroutant.
Je me doute que c'est pour des raisons de compat avec le C, mais ca change rien au pb...