OVH Cloud OVH Cloud

Ou apprendre le C++???

57 réponses
Avatar
nemrod2100
Bonjour Je desire apprendre le C++ je connais le C et Java .
Es ce que quelqu'un pourrait il m'indiquer par exemple un bon ouvrage a
acheter ou un bon site web avec Tutoriel.
En vous remerciant a l'avance
Cordialement

10 réponses

2 3 4 5 6
Avatar
drkm
"Alain Naigeon" writes:

"Loïc Joly" a écrit dans le message news:
ca5bgl$fnk$

Je ne vois pas plus de magie dans le passage par référence que dans
celui par valeur. Tu te rend compte, ta fonction, tu lui passe une
variable bien gentille, et pour une raison mystérieuse, elle décide de
ne pas l'utiliser mais de la copier ailleur et d'utiliser la copie !


La question n'est pas de syntaxe ; c'est une convention comme une
autre que "pas par référence" veut dire "par valeur", ce n'est pas le
point en cause de savoir pourquoi la fonction "décide de copier".
Ce qui est en cause, c'est que c'est facile de comprendre que la
modification d'une copie n'affecte pas l'original,


Il me semble plus simple encore de dire que lorsqu'une fonction
modifie son paramètre formel, le paramètre effectif est modifié. Il y
a identité entre les deux. C'est tout de même plus intuitif que de
penser qu'il y a une copie lors du passage de paramètre. En
désapprenant ce que je connais sur le C++, je m'attenderais à ce que

void incremente( int i ) {
++ i ;
}

incrémente la variable sur laquellle elle est appliquée.

et que, par contre,
il n'est pas évident d'expliquer comment fonctionne une référence
sans parler d'adresse.


Bah. « Les deux identificateurs désigne le même objet ». Le reste,
c'est de l'implémentation de compilateur. Parler d'adresse pour une
référence se situe au même niveau que de parler d'adresse pour une
variable automatique.

Le pointeur, c'est juste l'émergence de la notion
d'adresse dans le langage (s'il le permet). Une indirection, une variable
qui contient une adresse, c'est tout de même fondamental !
Même un bête "programmeur" Excel est obligé de se coltiner ça, alors,
si ça n'est pas à la portée d'un débutant C++ ..., que dire ?


Il n'a pas été dit que ce n'est pas à sa portée, mais qu'il n'en a
pas besoin pour utiliser std::vector. Il y a pas mal de points plus
intéressant pour un débutant que de se taper l'arithmétique des
pointeurs et l'allocation dynamique. Je retournerais le problème en
disant que s'il ne sait pas utiliser std::vector, je vois mal comment
il pourrait s'en sortir avec les pointeurs.

--drkm


Avatar
Franck Branjonneau
"Alain Naigeon" écrivait:

Ce qui est en cause, c'est que c'est facile de comprendre que la
modification d'une copie n'affecte pas l'original,


Tu n'as jamais modifié une copie qui modifiait l'original ?

et que, par contre, il n'est pas évident d'expliquer comment
fonctionne une référence sans parler d'adresse.


Ne suffit-il pas de parler d'indirection ?

Le pointeur, c'est juste l'émergence de la notion d'adresse dans le
langage (s'il le permet).


Qu'est(ce qu'un pointeur sur fonction membre ? une adresse ou une
indirection ?

Une indirection, une variable qui contient une adresse, c'est tout
de même fondamental !


Si la notion d'indirection est fondamentale ; celle d'adresse ne l'est
que pour manipuler la mémoire. Le problème n'est pas tant la manipulation
d'indirections avec des pointeurs ou des iterateurs que la gestion de
la mémoire dynamique avec des pointeurs.
--
Franck Branjonneau

Avatar
Fabien LE LEZ
On Wed, 09 Jun 2004 00:31:09 +0200, drkm
wrote:

Tout d'abord, il y a le fait de savoir ce qu'est un pointeur, et
l'utiliser de manière fiable. Tout programmeur C++ sais ce qu'est un
pointeur. Pour ce qui est de l'employer de manière fiable ...
Puis je trouve les références plus simples à comprendre que les
pointeurs. Pas d'allocation ou de désallocation dont tenir compte.


Euh... J'ai l'impression que tu mélange deux choses : pointeur et
allocation dynamique.

En-dehors des différences d'écritures, une référence ou un pointeur,
c'est pareil -- à ceci près qu'un pointeur peut être NULL, pas une
référence.

Un pointeur nu n'est qu'une façon de "pointer" un élément. Les autres
objets capables de le faire sont les références, les itérateurs, les
pointeurs intelligents, et peut-être d'autres.

Il n'y a a priori rien de bien compliqué dans le code suivant :

std::vector<int> v (10);
int * pointeur= & (v[3]);
int & reference= v[3];

Maintenant, le problème de l'allocation dynamique. Là encore, pas trop
de soucis :

int* ptr= new int;
int& ptr= * (new int); /* Note que cette écriture est valide avec les
compilateurs récents, car new ne peut pas renvoyer NULL. Avec un
compilo plus ancien, ou avec la version nothrow de new, elle est
invalide. */

Le problème survient quand :

- il faut désallouer la mémoire ainsi allouée. Non seulement il
ne faut pas oublier de le faire [et, sur le principe, l'écriture
allocation+désallocation me paraît inutilement tortueuse], mais il
faut également savoir à quel(s) endroit(s) le faire. Déjà en C c'est
passablement pénible, mais en C++, avec la gestion des exceptions,
c'est encore moins faisable.

- on veut allouer un certain nombre d'objets, nombre qu'on ne
connaît pas à la compilation. Heureusement, on a assez de types de
conteneurs à notre disposition pour se l'éviter :-)

--
;-)
FLL, Epagneul Breton

Avatar
Samuel Krempp
le Tuesday 08 June 2004 23:37, écrivit :
En Java, le passage se fait par référence


pour le coup, je trouve plutot que le passage Java suit le concept de
pointeur. car
public void foo(Toto x) {
x = new Toto( .. );
}

n'aura pas d'effet sur le paramètre au niveau de l'appelant.

Pour expliquer ça, il faut exactement le meme genre de dessins que pour
expliquer des pointeurs.

En pascal, le passage se fait par valeur par défaut, mais var autorise
le passage par référence


oui et j'aimais bien.
C'est le premier langage que j'ai appris (enfin après avoir un peu joué au
basic) en option au lycée, et je me rappelle qu'il n'a pas fallu longtemps
pour bien assimilier la distinction passage par valeur / par référence.
Et ce sans avoir besoin de visualiser un mécanisme de mémoire, adresses,
pointeurs,..

pour moi ça prouve bien que le concept de passage par référence se comprend
bien en lui même. Et qu'il n'y a pas besoin de concept de pointeur pour ça.

et ne fait nullement appel à la notion de
pointeur, et je n'ai jamais vu un cours d'introduction à l'un de ces
langages l'expliquer en disant "c'est un peu comme si c'était un
pointeur".


tout à fait d'accord.
(par contre pour java, si un cours explique le concept de pointeur pour
donner un nom au comportement du passage d'objet, ça ne me choquerait pas.
en java tout est pointeur ou type de base, ya pas d'objets par valeurs)

Je ne vois pas plus de magie dans le passage par référence que dans
celui par valeur. Tu te rend compte, ta fonction, tu lui passe une
variable bien gentille, et pour une raison mystérieuse, elle décide de
ne pas l'utiliser mais de la copier ailleur et d'utiliser la copie ! Si
ça c'est pas de la magie maléfique qui a influencé les concepteurs du
langage !


exactement !
j'ai ensuite compris que c'était dû à ce qu'un ordinateur est capable de
faire le plus efficacement. Mais qd on commence, le passage par référence
semble plus naturel.
Une fois qu'on connait ce qu'il y a sous le capot, on a tendance à s'y
réferer pour visualiser tout ce qui se passe, mais ce n'est pas forcément
la meilleure chose (jusqu'à ce qu'on soit amené à travailler au niveau du
capot et être confronté à ses contraintes, mais un programmeur débutant a
bien des choses à faire avant d'éventuellement en arriver là)

--
Sam

Avatar
tib.motuelle
Fabien LE LEZ wrote in message news:...
Euh... J'ai l'impression que tu mélange deux choses : pointeur et
allocation dynamique.

En-dehors des différences d'écritures, une référence ou un pointeur,
c'est pareil -- à ceci près qu'un pointeur peut être NULL, pas une
référence.


Une référence et un pointeur n'ont pas grand chose en commun:
- Une référence doit être initialisée
- Une référence ne pas être ré-initialisée (elle réfère toujours au
même objet)
- Une référence ne pas être nulle (comme tu le disais)

Il est assez courant de dire qu'une référence est un alias pour un
object existant (je pense même que c'est comme ca que notre prof nous
l'avait présenté). Qu'elles puissent être implémentées par le
compilateur comme un pointeur n'enlève rien au fait que ce sont deux
choses complètement différentes.

[...]

Le problème survient quand :

- il faut désallouer la mémoire ainsi allouée. Non seulement il
ne faut pas oublier de le faire [et, sur le principe, l'écriture
allocation+désallocation me paraît inutilement tortueuse], mais il
faut également savoir à quel(s) endroit(s) le faire. Déjà en C c'est
passablement pénible, mais en C++, avec la gestion des exceptions,
c'est encore moins faisable.


Je crois que tu dramatises un peu la situation. Toutes les techniques
de RAII facilitent grandement la tâche. L'utilisation de pointeurs
intelligents, allocation dans le constructeur/libération dans le
destructeur, ... permettent de s'affranchir de la plupart des
problèmes.

- on veut allouer un certain nombre d'objets, nombre qu'on ne
connaît pas à la compilation. Heureusement, on a assez de types de
conteneurs à notre disposition pour se l'éviter :-)


Tout à fait d'accord.

Bertrand.

Avatar
Michel Michaud
Dans news:40c62680$0$13821$, Alain
D'autre part, la distinction entre le passage d'argument par
valeur ou par adresse existe depuis la nuit des temps, et je


Pas dans les langages évolués. FORTRAN n'a pas le passage par
adresse (même s'il y a quelque chose d'effet semblable). Ni ALGOL
où ça ne porte pas ce nom et ça peut et a été implémenté autrement.
Ni COBOL où en réalité c'est un détail d'implémentation il me
semble. Je t'accorde que le passage d'adresse est un vieux
principe, suffit de faire de l'assembleur, mais la nuit des temps,
ce n'est pas C :-)

ne vois pas comment expliquer cela (ou une référence) sans
donner la notion de pointeur.


Tu manques d'imagination et/ou tu ne pourrais pas enseigner (ni
utiliser) un langage qui n'a pas ce principe !

Ou alors par effet papillon, téléportation, magie noire,
inégalité de Bell ?? Bon, je sais, on est dans la
civilisation presse-bouton, alors voilà, c'est magique, et on
t'expliquera plus tard... Là je me rebiffe !


Non, on utilise et on explique un concept abstrait. En réalité,
rien n'oblige le compilateur à faire un passage par adresse quand
on fait du C++ et qu'on utilise des références. Pense à une
fonction inline par exemple, où la référence sera un vrai alias...

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
Matthieu Moy
"Michel Michaud" writes:

ne vois pas comment expliquer cela (ou une référence) sans
donner la notion de pointeur.


Tu manques d'imagination et/ou tu ne pourrais pas enseigner (ni
utiliser) un langage qui n'a pas ce principe !


En même temps, les concepteurs de Java aussi ont du manquer
d'imagination le jour où ils ont écrit NullPointerException pour
^^^^^^^
désigner une référence ...

--
Matthieu


Avatar
drkm
Fabien LE LEZ writes:

On Wed, 09 Jun 2004 00:31:09 +0200, drkm
wrote:

Tout d'abord, il y a le fait de savoir ce qu'est un pointeur, et
l'utiliser de manière fiable. Tout programmeur C++ sais ce qu'est un
pointeur. Pour ce qui est de l'employer de manière fiable ...

Puis je trouve les références plus simples à comprendre que les
pointeurs. Pas d'allocation ou de désallocation dont tenir compte.


Euh... J'ai l'impression que tu mélange deux choses : pointeur et
allocation dynamique.


Non.

En-dehors des différences d'écritures, une référence ou un pointeur,
c'est pareil


?

Réécris-moi ceci avec des références :

int array[ 5 ] ;
for ( int * it , * end = array + 5 ; it < end ; ++ it ) {
* it = 0 ;
}

Je pense qu'il y a une grande confusion entre les deux en car il
s'agit de deux moyens pour référencer un autre objet. On imagine bien
qu'une référence doit être implémentée au moyen d'une adresse. On
pense donc pointeur. Mais comme je l'ai dit ailleurs, il s'agit
d'implémentation, et à ce titre, une vriable automatique possède
également une adresse, et l'on ne pense pourtant pas à un pointeur.

--drkm


Avatar
Gabriel Dos Reis
"Alain Naigeon" writes:

| "Fabien LE LEZ" a écrit dans le message news:
|
| > On Mon, 7 Jun 2004 23:05:52 +0200, "Alain Naigeon"
| > wrote:
| >
| > >> Même réponse que d'habitude : il ne s'agit pas d'en masquer
| > >> l'existence. Le problème est qu'il s'agit d'une notion complexe,
| > >
| > >Mais pas tant que ça, voyons !
| >
| > Pour un débutant complet (i.e. quelqu'un qui ne connaît pas encore
| > vector<> et string), si.
|
| Oh mais c'est énorme !! Des générations entières ont "digéré"
| les pointeurs avnt l'existence de vector et string ; je dirais même

Oui, des générations entières ont aussi fait la deuxième guerre
mondiale et la guerre d'Indochine.

-- Gaby
Avatar
Gabriel Dos Reis
"Alain Naigeon" writes:

| sans parler d'adresse. Le pointeur, c'est juste l'émergence de la notion
| d'adresse dans le langage (s'il le permet). Une indirection, une variable
| qui contient une adresse, c'est tout de même fondamental !

C'est fondamental lorsque cela est nécessaire.

| Même un bête "programmeur" Excel est obligé de se coltiner ça, alors,

Parce que Excel est un bête langage de programmation ?

-- Gaby
2 3 4 5 6