Jean-Francois Dive wrote:
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 ;)

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

Répondre à