CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++] class

dnob700
dnob700
Niveau 10
11 novembre 2004 à 21:01:42

question simple pour aujourd´hui :

quand une fonction retourne une class

par exemple :

class MaClass
{
public:
int GetNb();
private:
int Nb;
}
int MaClass::GetNb()
{
return Nb;
}

puis :
MaClass addition(MaClass,MaClass);

et qu´on fait un return à la fin de la fonction, qu´est ce uq´elle renvoie ? toute les données membre de la classe que je mets dans le return sont copiées, ou alors ça ne marche qu´avec des pointeurs ?

kufa
kufa
Niveau 9
12 novembre 2004 à 00:45:14

Hmm je comprends pas trop ta question..

" quand une fonction retourne une class"
tu parles d une instance je suppose

" puis :
MaClass addition(MaClass,MaClass);
et qu´on fait un return à la fin de la fonction, qu´est ce uq´elle renvoie ? toute les données membre de la classe que je mets dans le return sont copiées, ou alors ça ne marche qu´avec des pointeurs ? "

Hein?
ok quelques exemples:

class Test
{
public:
int a, b;
};

Test test1()
{
Test a;
return a;
}

Test& test2()
{
static Test1 a;
return a;
}

class Test_b
{
public:
int a,b;
private:
Test_b& operator=( const Test_b& ) ;
};

Test_b marchepas()
{
Test_b a;
return a;
}

int main()
{
Test a = test1(); / / object copie
Test& b = test2(); / / reference
Test_b c = test_marchepas(); / / compile pas
}

LGV
LGV
Niveau 28
12 novembre 2004 à 01:36:02

comme kUfa, j´ai pas tout saisi :/

ou alors p-e qu´il faut comprendre la question comme " que fait le constructeur par copie par défaut", ce que à quoi je répondrai qu´effectivement, toutes les données de l´instance sources sont dupliquées ( appel de ctor par copie pour chaque membre, à un niveau d´indirection : un pointeur vers une zone mémoire se copie en un nouveau pointeur vers la meme zone mémoire).

faut aussi voir qu´en utilisant un polymorphisme sur valeur de retour, toutes les données de l´instance peuvent ne pas etre copiées... bref, faudrait éclaircir la question :-?

dnob700
dnob700
Niveau 10
12 novembre 2004 à 19:50:06

le question est telle que tu l´a compris LGV.

qu´est ce qui se passe quand une fonction renvoie une instance de class ( pour utiliser du bon vocabulaire) ?

parce qu´avec des tests, j´ai vu que les données membres étaient copiées, mais je me demandais si le mécanisme en cause était plus subtil, ou s´il y avait des trucs particuliers à savoir dessus.

LGV
LGV
Niveau 28
13 novembre 2004 à 02:11:04

ben pour " renvoyer" l´objet ( donc ni une & ni un *, qu´on soit bien d´accord), c´est le ctor de copie qui est appelé. Le méchanisme du ctor de copie trivial ( fourni par le compilo) est assez simpliste : dupliquer les types primitifs, et appeler les ctor de copie des autres membres de ton objet ( appel en chaine de ctor par copie donc)
pour bien voir ce qui se passe, je te conseille d´écrire la forme canonique d´une classe et de foutre des breakpoints partout : tu verras bien qu´est-ce qui est appelé, et où.

ex. basique de proto d´une telle forme :

class Foo
{
public:
Foo(); / / default ctor
Foo(const Foo &); / / copy ctor
const Foo & =(const Foo &); / / assignment op.
~Foo(); / / dtor
};

LGV
LGV
Niveau 28
13 novembre 2004 à 02:12:55

petite note : à l´évidence, si tu un membre de type * dans un objet, et qu´en le copiant tu ne veux PAS que les deux instances partagent la meme zone mémoire ( copie brute de la valeur du pointeur..), tu DOIS redefinir le ctor de copie pour générer une nouvelle zone mémoire.

dnob700
dnob700
Niveau 10
14 novembre 2004 à 00:52:50

d´accord, merci, je vais essayer de faire joujou avec ça pour comprendre.

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment