Bonjour,
J'ai passé un test chez IT&M aujourd'hui (ils sont basés à Neuilly-sur-Seine).
Et autre le fait que j'ai appris certaines choses en C++ (si j'ai bien vu les réponses ) comme les templates ne respectent pas le principe de réécriture, que l'héritage en diamant se résout soit avec l'héritage virtuel soit avec l'héritage privé, que List ne permet pas de stocker des objets hétérogènes.
Mais surtout il y a 2 questions qui me scotchent totalement
Pour la petite histoire c'est la deuxième fois que je vais à IT&M, avec le même test, les mêmes interrogations et ... avec toujours autant de fautes d’orthographes (calsses, pr, propiété, cela dépends, ...)
C'est 2 fois la même question mais avec une fonction différente
Il faut dire si les fonctions 1) compilent 2) ne compilent pas 3) créent des fuites mémoire 4) cela dépend du compilateur
Code : Sélectionner tout - Visualiser dans une fenêtre à part int& meth(int& a) { return ++a; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part int& meth(int a) { return ++a; }
- Pour la fonction 1, on retourne le paramètre: sûrement un besoin de chaîner les appels. La réponse que j'ai réussi à voir (si j'ai bien vu) est 2) ne compile pas
- Pour la fonction 2, on retourne une référence sur un objet local. La réponse que j'ai réussi à voir (si j'ai bien vu) est 1) compile
J'ai sorti mes compilateurs et
- avec g++ 4.8.3 (sous Cygwin) cela fonctionne correctement, mais tu peux réussir à avoir des valeurs farfelues (avec 2 affichages consécutifs)
- avec Visual C++ 2010, cela ne fonctionne pas correctement, mais cela ne plante pas du tout.
Donc voila la question que je pose, parce que cela ne plante pas: est-ce qu'il faut soit voir une espèce d'optimisation style RVO soit rien du tout avec du code aussi minimaliste [pauvre] soit je m'y prends mal.
Ou alors, cela vient des références
Voici mes tests succincts:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 #include<iostream> #include<cstdio> int& meth1(int& a) { return ++a; } int& meth2(int a) { return ++a; } // attention : reference to local variable a returned [-Wreturn-local-addr] //int& meth3(int& a) { return a++; } // error C2440: 'return' : cannot convert from 'int' to 'int &' //int& meth4(int a) { return a++; } // error C2440: 'return' : cannot convert from 'int' to 'int &' using namespace std; int main(int argc, char* argv[]) { /*********************************** Meth1 ***********************************/ int a = 95; int b = meth1(a); // result: meth1(96): 96 cout << "meth1(" << a << "): " << b << endl; int& c = meth1(a); c = 10; b = 57; // result: meth1(10): 10, b: 57 cout << "meth1(" << a << "): " << c << ", b: " << b << endl; /*********************************** Meth2 ***********************************/ int d = meth2(b); // result: meth2(57): 58 cout << "meth2(" << b << "): " << d << endl; int& e = meth2(b); // d = 57; d = e + 15; // result: "meth2(57): 10, d: 57" or "meth2(57): 1582238320, d: 57" // cout << "meth2(" << b << "): " << e << ", d: " << d << endl; // result: "meth2(57): 58, d: 57" ou "meth2(57): 57, d: 57" printf("meth2(%d): %d, d:%d\n", b, e, d); // d = e + 15; // printf("meth2(%d): %d, d:%d\n", b, e, d); e = 92; // result: "e: 92" ou "e: 1582238320" // cout << "e: " << e << endl; // result: "e: 92" printf("e: %d\n", e); return 0; }
Partager