excellent. MErci Pascal. En fait c'est en donnant un coup de main a
un potte (crumpy) que j'ai vu ca dans son code, je me demandais vraiment comment ca
pourrait fonctionner. De toute facon, je prefere le C pour bcp de choses
donc ca va, je n'utilise pas ces horreurs ;)

J.

> 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 ;)
> 
> >>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
> >> du compilo ???).
> 
> 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=() de
> >l'object jef je pense. 
> Saut en cas d'optimisation ;)
> 
> >>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.
> En effet, tr?s mauvaise habitude (cf ci-dessus).
> 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.
> >Ici, il se passe kkchose derriere et c'est ca que j'aimerais comprendre. 
> 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).
> 
> >>On aurait du avoir AnsiString jef=AnsiString("This is a string")+10, 
> >>point de vue
> >>perso
> >> j'suis pas un gourou du tout !!!!
> 
> 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

-- 

-> Jean-Francois Dive
--> [EMAIL PROTECTED]

  I think that God in creating Man somewhat overestimated his ability.
  -- Oscar Wilde
_______________________________________________________
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

Répondre à