Partage
  • Partager sur Facebook
  • Partager sur Twitter

A quoi sert new et this en C++

new , this , ifdef endif en c++ utilisation

    22 novembre 2017 à 14:40:05

    Salut

    Puisque j'ai en vain chercher en internet , et jai realisé que j'ai perdu beaucoup de temps jai decide decrire  ce sujet puisque  tout ce qui est en ligne me parait un peu complique :

    A quoi sert new et this en C++ 

    jai aussi besoin dexplication precise pour ce cas pour quon la vu en cours  .

    v = new double[dim]; // Ici ou on la utilise dans le constructeur dune classe( vec )

    vec::~vec()
    
    {
    
    	delete[] v;// Ici pourquoi on utilise delete[]
    
    	ifdef TEST // A quoi sert ifdef et apres endif
    
    		cout << "OK" << endl;
    
    #endif
    
    }
    vec vec::operator+(const vec& b) const
    
    {
    
    	if (dim != b.dim)
    
    	{
    
    		cerr << "les vecteurs nont pas la meme dimension" << endl;
    
    		abort();
    
    	}
    
    	vec erg(dim);
    
    	int i;
    
    	for (i = 0; i < dim; i++)
    
    	{
    
    		ergebnis.v[i] = v[i] + b.v[i];
    
    		return ergebnis;
    
    	}

    jai compris la methode ci dessus mais pourquoi le prof ajoute ces methodes et il retourne *this ( est ce la precedente nest pas suffisante pour faire le travail ?)

    vec vec::operator + () const
    {
    	return *this;
    }
    
    
    /////////////////////
    
    vec& vec::operator += (const vec& partiedroite)
    	{
    		if (dim != partiedroite.dim)
    		{
    			cerr<<"les vecteurs nont pas la meme dimensions"<<endl;
    			abort();
    		}
    		int i;
    		for (i=0; i<dim; i++)
    			v[i] += partiedroite.v[i];
    		return *this;
    	}

    et il ajoute a la fin index operator 

    double operator [] (int index) const;

    A quoi ca sert et a quoi ca sert quon ajoute const ici

     Merci davance

    -
    Edité par anti-runescape 22 novembre 2017 à 14:42:45

    • Partager sur Facebook
    • Partager sur Twitter
      22 novembre 2017 à 15:16:23

      Salut,

      Tout d'abord, je te conseille la lecture d'un cours correct de C++, ça devrait vraiment te clarifier des tas de choses, et le faire mieux qu'une réponse sur un forum

      new sers à créer un nouvel objet sur le tas. New va alouer de la mémoire où ranger l'objet puis appeler le constructeur de l'objet. New va ensuite vérifier que l'objet est correctement construit (i.e., aucune exception n'a quité le constructeur). Si ce n'est pas le cas, il désaloue la mémoire allouée, et propage l'exception.

      Un objet alloué par new, et correctement construit, doit être détruit par delete.

      This contient l'adresse de l'instance en cours d'une classe. Par exemple :

      struct A{
        void f(){ std::cout<<"j'ai l'adresse " << &(*this)<<"\n";}
      };
      
      void test(){
        A a;
        std::cout << "a a l'adresse" << &a << "\n";
        a.f(); //affiche la même adresse
      }
      
      
      

      Quand a ton code, je suppose que c'est l'extrait d'un code qui fait en moins bien ce que std::array fait en bien. Dans le constructeur de array, on a du écrire un truc du genre v=new Truc[]; Comme cet objet doit être détruit à un moment, on le fait dans le destructeur avec delete[] v.

      -
      Edité par ledemonboiteux 22 novembre 2017 à 15:19:27

      • Partager sur Facebook
      • Partager sur Twitter
        22 novembre 2017 à 15:57:20

        Il pue la naphtaline votre cours !!!

        On ne programme pas/plus comme ça en C++ depuis bien longtemps.

        >A quoi sert new et this en C++

        "new" sert à allouer dans le tas (mémoire) un certain nombre d'octets, fonction de la classe, et appelle les différents constructeurs nécessaire à l'initialisation de l'objet ainsi alloué.

        "this" est un pointeur sur l'objet "courant", ça n'a donc du sens que dans le cas de méthodes/fonctions d'instance, où un paramètre caché est passé en plus de ceux indiqués par la signature de la méthode/fonction : l'instance de l'objet où la méthode/fonction s'applique. "this" permet de récupérer ce fameux paramètre caché correspondant à l'objet "courant".

        >v = new double[dim];

        ici, on alloue pas un double, mais un tableau de double d'une taille de dim*sizeof(double) octet (environ packint tout ça).

        C'est le genre d'utilisation de tableau à la C qu'on fait plus en C++ depuis au moins 2011 et le passage au standard C++11.

        >delete[] v;

        "new ...[]", c'est pas la même chose que "new", alors, pour que le compilateur puisse générer le code correspondant à "new ...[]" et pas à "new", on écrit "delete[]" et pas "delete". Mais bon, on s'en fout, on ne devrait plus utiliser de tableau C en C++ depuis bien longtemps.

        >ifdef

        C'est pas "ifdef", c'est "#ifdef".

        Ici, c'est une manière très crade d'avoir des traces d'exécutions qu'on peut activer ou désactiver en changeant la constante de compilation "TEST", Cherchez pas, c'est merdique comme manière de faire.

        Pour l'opérateur + sans paramètre, je sais pas.

        Pour l'opérateur +=(const vect&), retourner "*this" c'est pour pouvoir chainer les affectations, du genre :

        x = (y+=2);

        (code crade)

        et "+", c'est pas "+=".

        >A quoi ca sert et a quoi ca sert quon ajoute const ici

        C'est la "constcorrectness", c'est indiqué au compilateur et au code client de cette fonction que la fonction s'engage à ne pas modifier ce qui est décoré avec "const".

        Sir un objet "const", vous ne pouvez appeler que les méthodes indiquant qu'elle sont "const" (qu'elle ne modifie pas l'objet).



        • Partager sur Facebook
        • Partager sur Twitter
        Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
          23 novembre 2017 à 14:43:26

          Tout les éléments de réponses ont l'air d'être là, du coup je me permet un peu de hors sujet

          bacelar a écrit:

          Ici, c'est une manière très crade d'avoir des traces d'exécutions qu'on peut activer ou désactiver en changeant la constante de compilation "TEST", Cherchez pas, c'est merdique comme manière de faire.

          Tu peux développer un peu ? Je ne saisis pas pourquoi c'est une mauvaise manière de faire
          • Partager sur Facebook
          • Partager sur Twitter
          Dream on, Dream on, Dream until your dream comes true
            23 novembre 2017 à 14:55:06

            Parce que c'est illisible, pas safe (équilibrage de accolade, etc...), pollue le code avec des fonctionnalités orthogonales, ne gère pas des niveaux de logs, on doit tout recompiler pour changer un pauvre machin, etc...

            Si c'est pour la pédagogie, on fait simple, la ligne directe. Pour la production, on utilise un vrai framework de log, voir de la programmation par aspect pour ce type de log "à la con".

            Moi, je suis plus sur des logs "utiles" (fonctionnelles + via crashdump de watchdog) que du truffage de code avec des copier-coller de machine pour logger systématiquement tout mais surtout nimportenawak.

            • Partager sur Facebook
            • Partager sur Twitter
            Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
              24 novembre 2017 à 12:28:00

              bacelar a écrit:

              Pour l'opérateur +=(const vect&), retourner "*this" c'est pour pouvoir chainer les affectations, du genre :

              x = (y+=2);

              tu peux stp detailler ce que tu veux dire par "*this" c'est pour pouvoir chainer les affectations

              • Partager sur Facebook
              • Partager sur Twitter
                24 novembre 2017 à 13:57:45

                "this", c'est le pointeur sur l'objet courant.

                Pour pouvoir chaines des opérations, il faut que la méthode retourne un truc/machin sur lequel on veut faire d'autres opérations.

                Renvoyer "*this" n'est qu'une convention, si tu veux renvoyer autre chose, tu peux le faire, tant que tu respects le type.

                Mais bon, le code résultant sera peu compréhensible.

                • Partager sur Facebook
                • Partager sur Twitter
                Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

                A quoi sert new et this en C++

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown