On Thu, Feb 12, 2004 at 03:54:43PM +0100, [EMAIL PROTECTED] wrote:
De: Jean-Francois Dive <[EMAIL PROTECTED]>
oui mais le probleme c'est: l'operateur de quel object ? Aussi loin que je sache, "bla" c'est une string (4 bytes en memoire), pas un obect sur lequel tu appelle la methode operator(). Le + machin ok, c'est juste pour montrer que le casting de la string resulte bien en un object.
| AnsiString jef = (AnsiString)"This is a string" + 10;
C'est la m�me chose que
AnsiString jef = AnsiString("This is a string")::operator+(10);
Les r�gles de pr�c�dence math�matiques sont �galement appliqu�es au op�rateurs surcharg�s; il est d'ailleurs impossible de modifier les r�gles de pr�c�dence des op�rateurs (encore heureux, c'est d�j� assez le bordel comme �a ;)).
C'est assez �trange comme construction:
1) c'est � bannir parce que c'est illisible - un gars dans mon projet me fait �a, il se prend des claques
2) les cast � la C sont mauvais et � bannir �galement; il y a des constructions beaucoup plus propice � cela en C++ et qu'il faut utiliser � tous les coups (dynamic_cast, static_cast, const_cast, reinterpret_cast).
Il faut savoir qu'un cast "C" �quivaut � un reinterpet_cast (!!!), qui est une cochonnerie qui permet de caster n'importe quoi vers n'importe quoi et qui ne donne qu'une chose: des probl�mes. Si vous �crivez du code qui a besoin de �a, repensez votre concept, il y a forc�ment une erreur quelque part.
Il vaut bien mieux utiliser un static_cast (ou un dynamic_cast pour faire un "upcast").
Ici une explication un peu plus d�taill�e: http://www.sjbrown.co.uk/static_cast.html
3) Je me demande bien ce que AnsiString::operator+(const int) peut bien faire. Ce n'est pas compr�hensible de suite alors que c'est une construction �l�mentaire, c'est donc �galement � bannir.
Soit AnsiString::operator+(const int) retourne un AnsiString et dans ce cas fait ensuite appel � AnsiString::operator=(const AnsiString&), ou alors il retourne un int, et cela donnera un appel � AnsiString::operator=(const int).
En tout cas c'est une horreur ;)
>> du compilo ???).Je vois �a comme �a AnsiString jef= (AnsiString)"This is a string" Donc cast "This is a string" dans ansiString qui appelera le constructeur de copie pour l'assignation =, il n'y a pas appel au constructeur ni cr�ation d'objet (d�pend
Il y a tout d'abord un appel � un constructeur d'AnsiString:
AnsiString::AnsiString(const char*)
ensuite l'op�rateur de copie:
AnsiString::operator=(const AnsiString&)
Evidemment, pour la variable "jef", il y a �galement un appel au constructeur par d�faut pour cr�er l'objet avant l'appel de operator=
On pourrait penser que cela se passe comme �a, mais 95% des compilateurs C++ feront une optimisation et vont en faire ceci _un seul appel_:
AnsiString::AnsiString(const char*) (pour initialiser "jef"), ce qui reviendrait � �crire:
AnsiString jef("This is a string");
A essayer: ------8<------------------------------------------------------ #include <string> #include <iostream>
class MyString : private std::string {
public:
MyString() : std::string() {
std::cout << "MyString()" << std::endl;
} MyString(const char* cstr) : std::string(cstr) {
std::cout << "MyString(const char*)" << std::endl;
} MyString(const MyString& str) : std::string(str) {
std::cout << "MyString(const MyString&)" << std::endl;
} virtual ~MyString() {
std::cout << "~MyString()" << std::endl;
} const MyString& operator=(const MyString& str) {
std::string::operator=(str);
std::cout << "MyString::operator=()" << std::endl;
return *this;
}
};int main() {
MyString jef = (MyString)"foo";
return 0;
}
------8<------------------------------------------------------Cela donnera ceci:
MyString(const char*) ~MyString()
Vous pouvez aussi l'essayer dans le debugger, c'est bien ce qui se passe.
Notez que j'ai test� avec GCC 3.3.1 (qui est un excellent compilateur - probablement le meilleur qui soit en terme de respect des standards C++ (oui, m�me nettement meilleur que MSVC++ ou Borland)).
il n'appellera pas le constructuer de copie mais l'operator=() deSaut en cas d'optimisation ;)
l'object jef je pense.
En effet, tr�s mauvaise habitude (cf ci-dessus).Cela vient du C, struct my_struct f=(struct my_struct) g; ou on cast g dans un object my_struct ! Je pense que c'est � �viter, mauvaise habitude.
Les castings C++ sont plus longs � �crire mais ont le m�rite d'�tre tr�s clairs et tr�s lisibles.
le truc en C c'est que un cast change le type du pointer, c'est tout.C'est tr�s diff�rent en C++ en fait, �tant donn� qu'il y a toutes les informations dans la virtual table (h�ritage) et RTTI (RunTime Type Information).
Ici, il se passe kkchose derriere et c'est ca que j'aimerais comprendre.
>> j'suis pas un gourou du tout !!!!On aurait du avoir AnsiString jef=AnsiString("This is a string")+10, point de vue perso
On aurait surtout du avoir un commentaire qui explique ce que fait le +10 lol
-- -o) Pascal Bleser http://guru.unixtech.be /\\ <[EMAIL PROTECTED]> <[EMAIL PROTECTED]> _\_v The more things change, the more they stay insane. _______________________________________________________ Linux Mailing List - http://www.unixtech.be Subscribe/Unsubscribe: http://www.unixtech.be/mailman/listinfo/linux Archives: http://www.mail-archive.com/[EMAIL PROTECTED] IRC: chat.unixtech.be:6667 - #unixtech

