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