OVH Cloud OVH Cloud

Probleme de comprehension : constructeur de copie (templates?)

53 réponses
Avatar
Alex Paris
Bonjour =E0 tous !

Voil=E0 mon petit exemple que je compile en utilisant g++ (cygwin)


#include <iostream>

using namespace std;

template<class T>
class Matrix
{
public:
Matrix(int size);
Matrix(const Matrix<T> &copy);

~Matrix();

Matrix<T>& operator=3D(const Matrix<T>& matrix);

Matrix<T> operator+(const Matrix<T>& second);

private:
int _size;
};

template <class T>
Matrix<T>::Matrix(int size)
: _size(size)
{
cout << "--- Constructor called --- " << endl;
}

template <class T>
Matrix<T>::Matrix(const Matrix<T> &copy)
: _size(copy._size)
{
cout << "--- Copy constructor called --- " << endl;
}

template <class T>
Matrix<T>::~Matrix()
{
cout << "--- Destructor called --- " << endl;
}

template <class T>
Matrix<T>& Matrix<T>::operator=3D(const Matrix<T>& matrix)
{
cout << "--- Operator \"=3D\" called --- " << endl;
_size =3D matrix._size;
}

template <class T>
Matrix<T> Matrix<T>::operator+(const Matrix<T>& second)
{
cout << "--- Operator \"+\" called --- " << endl;
Matrix<T> result(_size);
return result;
}



int main()
{
cout << "Declaration m1" << endl;
Matrix<int> m1(2);
cout << "Declaration m1" << endl;
Matrix<int> m2(2);

cout << "Declaration mSum1" << endl;
Matrix<int> mSum1(2);
cout << "mSum1 =3D m1 + m2" << endl;
mSum1 =3D m1 + m2;

cout << "Declaration mSum2 =3D m1 + m2" << endl;
Matrix<int> mSum2 =3D m1 + m2;

cout << "Declaration mSum3" << endl;
Matrix<int> mSum3(2);
mSum3 =3D m1 + m2;

cout << "Declaration m4 =3D mSum3" << endl;
Matrix<int> m4 =3D mSum3;

int ret;
cin >> ret;

return ret;
}


Comme on voit bien dans le programme en bas la cr=E9ation est appell=E9e
plusieurs fois.

Et voil=E0 la sortie du programme :

$ ./a.exe
Declaration m1
--- Constructor called ---
Declaration m1
--- Constructor called ---
Declaration mSum1
--- Constructor called ---
mSum1 =3D m1 + m2
--- Operator "+" called ---
--- Constructor called ---
--- Operator "=3D" called ---
--- Destructor called ---
Declaration mSum2 =3D m1 + m2
--- Operator "+" called ---
--- Constructor called ---
Declaration mSum3
--- Constructor called ---
--- Operator "+" called ---
--- Constructor called ---
--- Operator "=3D" called ---
--- Destructor called ---
Declaration m4 =3D mSum3
--- Copy constructor called ---
0
--- Destructor called ---
--- Destructor called ---
--- Destructor called ---
--- Destructor called ---
--- Destructor called ---
--- Destructor called ---


Ce que m'int=E9resse le plus c'est pourquoi j'ai ces lignes l=E0 :
Declaration mSum2 =3D m1 + m2
--- Operator "+" called ---
--- Constructor called ---

Je ne vois pas l'operator=3D ni de constructeur de copie. Si je mets le
vrai code pour la classe matrix, le mSum2 est en effet la somme des 2,
l'objet est cr=E9=E9 et vit bien =E7a vie...

Quelqu'un saurait-il m'expliquer la suite des appels ici ? J'imagine
que la ligne
--- Constructor called ---
correspond =E0 la cr=E9ation de l'objet temporaire dans l'operator +. Mais
o=F9 est la trace de l'operator =3D ?



Merci d'avance
A+

3 réponses

2 3 4 5 6
Avatar
espie
In article ,
Alex Paris wrote:
On 8 août, 15:47, Fabien LE LEZ wrote:

Étre à un niveau suffisamment avancé pour écrire ses propres
templates, et ne pas connaître la base (i.e. la notion de tableau), ça
fait peur...


Et ben non, la notion de tableau est bien connue ! Il y a un pointeur
T** dans mon exemple

J'ai une impression qu'on parle pas de la même chose. Rappelez-vous du
bon vieux temps quand on faisait des exercices de toute sorte à
l'école sans utiliser les librairies. Non ? Jamais ? Mais alors...


J'ai toujours trouve ca cretin comme facon de proceder. Apres, on se
retrouve avec des eleves qui reimplementent des bouts de la bibliotheque
standard de facon bugguee pour rien, ou qui ont du mal a ne pas tout
refaire eux-memes `parce que, de toutes facons, la bibliotheque standard,
elle est pourrie'. (vu d'experience avec certains elements de certaine
ecole qui fait reimplementer un gros bout de la bibliotheque C en premiere
annee). On peut se dire, on gagne du temps, on va leur faire reecrire
un bout de la bibliotheque, comme ca ils la connaitront sur le bout des
doigts, et ca fera autant de gagne en cours.

Ben en fait, non. Ca marche pas du tout du tout. A la place, ils implementent
les trucs de travers, et apres ils se trimballent avec des idees fausses
sur ce qu'ils ont fait jusqu'a ce que quelqu'un vienne les detromper.


Avatar
espie
In article ,
Fabien LE LEZ wrote:

Accessoirement, on peut se demander s'il est raisonnable d'enseigner
le C++ à l'école. De toutes façons, même un prof compétent a trop peu
d'heures de cours pour donner autre chose qu'une introduction.


Je ne sais meme pas si ca a du sens de faire un vrai gros cours de C++.
Lorsqu'on en arrive aux vrais bouts sympa du langage, ca devient plus
interessant de faire un cours sur certains aspects de methodologie:
design patterns, refactoring, et gestion des exceptions.

Le seul autre cours que je vois, c'est un cours d'initiation, ou pour
des raisons plus ou moins specieuses, on a decide que les gens avaient
besoin de `connaitre' un langage de type C. Faire `un peu' de C++ permet
de profiter des messages d'erreur du compilo, plus strict que celui du C.
Et une utilisation raisonnee de la bibliotheque standard (string, vector,
iostream) permet d'eviter totalement de parler d'allocation memoire et
de pointeur, et de prendre une ou deux heures a expliquer printf.

Evidemment, ca fait pas des gens qui parlent C++, ca fait juste des gens qui
arrivent a ecrire des petits programmes dans un langage C/C++-like sans y
passer des dizaines d'heures et se prendre trois tonnes de segfault...

Avatar
espie
In article <46b9c32b$0$21534$,
Michael DOUBEZ wrote:

Mon propos etait qu'un simple vector est mieux qu'un vector de vector.
Le redimensionnement d'une matrice représentée par un vector de vector
impliquerait de redimensionner chaque ligne ce qui est assez laid de
tous les points de vue. Bon, mon exemple de matrice avec des lignes de
différentes tailles en case d'exception n'est ni explicite, ni
pertinent, c'est vrai.


De toutes facons, si tu veux bosser avec des vraies matrices, faut plutot
aller fouiller du cote de valarray que de vector...

2 3 4 5 6