Bonjour,

nous recherchons un dev cpp senior. Je suis donc en train de préparer un test technique, auquel la personne devra répondre à l'oral. C'est de l'oral, donc les questions sont vagues, le but étant de laisser parler le candidat afin de juger de son niveau.

J'aurais aimé savoir ce que vous pensez de ces questions. Sont-elles pertinentes? Le test est-il trop facile, trop difficile? Bref, avoir votre avis général sur le test:

1. Les bases
Différence entre struct et class.
Qu’est-ce que la const-conformité ?
Qu’est-ce qu’un pointeur intelligent ? Donner des exemples (boost, STL,…).
Quel est l’impact de l’utilisation d’exceptions sur les performances (au runtime) ?

2. Poo en c++
Différence entre héritage privé et public.
Qu'est-ce que la forme canonique orthodoxe de Coplien ?
Que coûte un héritage (en termes de perf au runtime) ?
Que se passe-t-il si on appelle une fonction virtuelle dans un constructeur ?

3. Templates
Que sont des classes de Trait et de Policy ?
Qu’est-ce que CRTP ?
Qu’est-ce qu’une liste de types ? A quoi ça peut servir ?

4. C++11
Qu’est-ce que la move semantic (principe, syntaxe)?
Qu’est-ce le default destructor ? Quel est l’intérêt ?
Que devient la forme canonique de Coplien en c++11 ?
Quand est-ce qu’un lambda peut-être utile ?
auto vs typedef

5. Patterns & idioms
Cheshire cat (pimpl).
NVI / clone idiom
RAII
LSP
SRP

6. Méthodologie
Que fait un « svn reverse » ?
Qu’est-ce que l’unit testing ?
Qu’est-ce que le profiling ?


Commenter le code suivant :

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
template <typename ContainerType, typename FillFonctorType>
void FillContainer(ContainerType & container, size_t size)
{
	ContainerType(size).swap(container);
	std::for_each(container.begin(), container.end(), FillFonctorType());
}
 
 
template <typename ContainerType, typename PredicateType>
void RemoveIf(ContainerType & container, const PredicateType & predicate)
{
	for (auto it = container.begin(); it != container.end();++it)
		container.erase(std::remove_if(container.begin(), container.end(), predicate), container.end());
}
 
 
struct RandomIntGeneratorFonctor
{
	RandomIntGeneratorFonctor(int min=-10, int max=10) : distribution(std::uniform_int_distribution<int>(min, max)) {}
	int operator () () { return distribution(random_int_generator); }
	void operator () (int & value ) { value = distribution(random_int_generator); }
private: std::uniform_int_distribution<int> distribution;
};
 
 
template <typename T>
struct LazyComparePredicate
{
	LazyComparePredicate(const T & compared_element) : compared_element(compared_element) {}
	bool operator () (const T & to_compare) { return (to_compare == compared_element); }
private: T compared_element;
};
 
 
main()
{
	typedef std::vector<int> IntVector;
	IntVector my_vector(10);
	std::generate(my_vector.begin(), my_vector.end(), RandomIntGeneratorFonctor(0, 10));
	FillContainer<IntVector, RandomIntGeneratorFonctor>(my_vector, 10);
	RemoveIf<IntVector, LazyComparePredicate<int>>(my_vector, LazyComparePredicate<int>(5));
}