how to master c++
DESCRIPTION
These are the slides of my talk organized at the Université de Nantes, on March 13, 2014, by the student association in computer science ASCII. The target audience is people with some C++ knowledges interested by learning good practices and common pitfalls.TRANSCRIPT
How to master C++
Florian Richoux
March 13, 2014
Florian Richoux How to master C++ 1 / 57
Licence CC BY-NC-SA 4.0
Attribution-NonCommercial-ShareAlike 4.0 International
This talk is licensed CC BY-NC-SA 4.0.
This license covers the general organization of the material, the textualcontent, the �gures, etc. except where indicated.
All �Calvin and Hobbes� images are c©Bill Watterson.
This license means that you can share and adapt this course, providedyou give appropriate credit to the author, use the material fornon-commercial purposes and distribute your contributions under thesame license as the original. For more information about this license, seehttp://creativecommons.org/licenses/by-nc-sa/4.0/.
Florian Richoux How to master C++ 2 / 57
Why C++?
CC BY 2.0
http://www.lextrait.com/vincent/implementations.html
Florian Richoux How to master C++ 3 / 57
Why C++?
CC BY 2.0
http://www.lextrait.com/vincent/implementations.html
Florian Richoux How to master C++ 3 / 57
Why C++?
CC BY 2.0
http://www.lextrait.com/vincent/implementations.html
Florian Richoux How to master C++ 3 / 57
Outline
I Quick recalls about virtualI Object copyI Memory managementI Extra
Randall Munroe, CC BY-NC 2.0
http://xkcd.com/138/
Florian Richoux How to master C++ 4 / 57
Some (virtual) recalls
Florian Richoux How to master C++ 5 / 57
Some quick recalls
#i n c l u d e <ios t r eam>us ing namespace s t d ;
s t r u c t A {vo id f ( ) { cout << "Class A" << end l ; }
} ;
s t r u c t B: A {vo id f ( ) { cout << "Class B" << end l ; }
} ;
i n t main ( ) {A ∗a = new B;a−>f ( ) ;de le te a ; // ?
}
Output
Class A
Florian Richoux How to master C++ 6 / 57
Some quick recalls
#i n c l u d e <ios t r eam>us ing namespace s t d ;
s t r u c t A {vo id f ( ) { cout << "Class A" << end l ; }
} ;
s t r u c t B: A {vo id f ( ) { cout << "Class B" << end l ; }
} ;
i n t main ( ) {A ∗a = new B;a−>f ( ) ;de le te a ; // ?
}
Output
Class A
Florian Richoux How to master C++ 6 / 57
Some quick recalls
#i n c l u d e <ios t r eam>us ing namespace s t d ;
s t r u c t A {v i r t u a l vo id f ( ) { cout << "Class A" << end l ; }
} ;
s t r u c t B: A {vo id f ( ) { cout << "Class B" << end l ; }
} ;
i n t main ( ) {A ∗a = new B;a−>f ( ) ;de le te a ; // ?
}
Output
Class B
Florian Richoux How to master C++ 7 / 57
Some quick recalls
#i n c l u d e <ios t r eam>us ing namespace s t d ;
s t r u c t A {v i r t u a l vo id f ( ) { cout << "Class A" << end l ; }
} ;
s t r u c t B: A {vo id f ( ) { cout << "Class B" << end l ; }
} ;
i n t main ( ) {A ∗a = new B;a−>f ( ) ;de le te a ; // ?
}
Output
Class B
Florian Richoux How to master C++ 7 / 57
Some quick recalls
c l a s s Base{
. . .} ;
c l a s s Der i v ed : pub l i c Base{
~Der i v ed ( ){
// Do some impor tan t c l e anup}
}
Base ∗b = new Der i v ed ( ) ;// use bde le te b ; // Here ' s the problem : ( u s u a l l y ) c a l l ~Base ( )
http:
//stackoverflow.com/questions/461203/when-to-use-virtual-destructors
Florian Richoux How to master C++ 8 / 57
Some quick recalls
c l a s s Base{
pub l i c : v i r t u a l ~Base ( ) { }} ;
c l a s s Der i v ed : pub l i c Base{
~Der i v ed ( ){
// Do some impor tan t c l e anup}
}
Base ∗b = new Der i v ed ( ) ;// use bde le te b ; // c a l l ~De r i v ed ( )
http:
//stackoverflow.com/questions/461203/when-to-use-virtual-destructors
Florian Richoux How to master C++ 9 / 57
Some quick recalls
s t r u c t A { v i r t u a l ~A( ) { } } ;s t r u c t B : A { } ;
s t r u c t C { } ;s t r u c t D : C { } ;
i n t main ( ) {B b ;A∗ ap = &b ;A& ar = b ;cout << "ap: " << type id (∗ ap ) . name ( ) << end l ;cout << "ar: " << type id ( a r ) . name ( ) << end l ;
D d ;C∗ cp = &d ;C& c r = d ;cout << "cp: " << type id (∗ cp ) . name ( ) << end l ;cout << "cr: " << type id ( c r ) . name ( ) << end l ;
}
Output
ap: Bar: Bcp: Ccr: C
http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?
topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fthe_typeid_operator.htm
Florian Richoux How to master C++ 10 / 57
Some quick recalls
s t r u c t A { v i r t u a l ~A( ) { } } ;s t r u c t B : A { } ;
s t r u c t C { } ;s t r u c t D : C { } ;
i n t main ( ) {B b ;A∗ ap = &b ;A& ar = b ;cout << "ap: " << type id (∗ ap ) . name ( ) << end l ;cout << "ar: " << type id ( a r ) . name ( ) << end l ;
D d ;C∗ cp = &d ;C& c r = d ;cout << "cp: " << type id (∗ cp ) . name ( ) << end l ;cout << "cr: " << type id ( c r ) . name ( ) << end l ;
}
Output
ap: Bar: Bcp: Ccr: C
http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?
topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fthe_typeid_operator.htm
Florian Richoux How to master C++ 10 / 57
Some quick recalls
s t r u c t A { v i r t u a l ~A( ) { } } ;s t r u c t B : A { } ;
s t r u c t C { } ;s t r u c t D : C { } ;
i n t main ( ) {B b ;A∗ ap = &b ;A& ar = b ;cout << "ap: " << type id (∗ ap ) . name ( ) << end l ;cout << "ar: " << type id ( a r ) . name ( ) << end l ;
D d ;C∗ cp = &d ;C& c r = d ;cout << "cp: " << type id (∗ cp ) . name ( ) << end l ;cout << "cr: " << type id ( c r ) . name ( ) << end l ;
}
Output
ap: Bar: Bcp: Ccr: C
http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?
topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fthe_typeid_operator.htm
Florian Richoux How to master C++ 10 / 57
Object copy
Florian Richoux How to master C++ 11 / 57
Copy constructor and copy assignment operator
c l a s s Person{
s td : : s t r i n g name_ ;i n t age_ ;
pub l i c :Person ( s td : : s t r i n g name , i n t age )
: name_(name ) , age_( age ) { }} ;
i n t main ( ){
Person a ( "Bjarne Stroustrup" , 6 3 ) ;Person b ( a ) ; // What happens he r e ?b = a ; // And he r e ?
}
Florian Richoux How to master C++ 12 / 57
Copy constructor and copy assignment operator
// 1 . copy c o n s t r u c t o rPerson ( const Person& tha t )
: name_( tha t . name_) , age_( tha t . age_) { }
// 2 . copy as s i gnment op e r a t o rPerson& operator=(const Person& tha t ){
name_ = tha t . name_ ;age_ = tha t . age_ ;re tu rn ∗ t h i s ;
}
Signature
Classname ( const Classname& ) // copy c t o rClassname& operator=( const Classname& ) // as s i gnment op
Florian Richoux How to master C++ 13 / 57
Copy constructor and copy assignment operator
i n t main ( ){
Person a ( "Bjarne Stroustrup" , 6 3 ) ;Person b ( a ) ; // C a l l the copy c t o rb = a ; // C a l l the copy as s i gnment op e r a t o rPerson c = a ; // ?
}
More about initializations
http://herbsutter.com/2013/05/09/gotw-1-solution/
Florian Richoux How to master C++ 14 / 57
Copy constructor and copy assignment operator
i n t main ( ){
Person a ( "Bjarne Stroustrup" , 6 3 ) ;Person b ( a ) ; // C a l l the copy c t o rb = a ; // C a l l the copy as s i gnment op e r a t o rPerson c = a ; // C a l l the copy c t o r
// ( a lmost e q u i v a l e n t to Person c ( a ) )}
More about initializations
http://herbsutter.com/2013/05/09/gotw-1-solution/
Florian Richoux How to master C++ 15 / 57
In which situations is the C++ copy constructor called?
MyClass a ;MyClass b ( a ) ; // copy c o n s t r u c t o r
// //////////////
vo id f oo ( MyClass x ) ;foo ( a ) ; // copy c o n s t r u c t o r
// ( but can be moved i n C++11)// A s imp l e t h i n g to avo i d t h i s ?
// //////////////
MyClass foo ( ){
MyClass temp ;. . .re tu rn temp ; // copy c o n s t r u c t o r
// ( but u s u a l l y RVO a p p l i e s )}
http://stackoverflow.com/questions/21206359/
in-which-situations-is-the-c-copy-constructor-called
Florian Richoux How to master C++ 16 / 57
In which situations is the C++ copy constructor called?
MyClass a ; // c o n s t r u c t o rMyClass b ; // c o n s t r u c t o ra = b ; // copy as s i gnment opb = MyClass ( a ) ; // copy c t o r + copy as s i gnment op
MyClass ∗a = new MyClass ( ) ; // c o n s t r u c t o rMyClass ∗b ; // no th ing i s c a l l e db = a ; // s t i l l no th i ng i s c a l l e db = new MyClass (∗ a ) ; // copy c o n s t r u c t o r
http://stackoverflow.com/questions/21206359/
in-which-situations-is-the-c-copy-constructor-called
Florian Richoux How to master C++ 17 / 57
Why writing a copy ctor and a copy assignment operator?
Question
Why do we need to (sometimes) write them?
Reformulated question
When do we need to write them?
Answer
Each time you have a class managing resources (like manipulatingmemory, pointers)!
Florian Richoux How to master C++ 18 / 57
Why writing a copy ctor and a copy assignment operator?
Question
Why do we need to (sometimes) write them?
Reformulated question
When do we need to write them?
Answer
Each time you have a class managing resources (like manipulatingmemory, pointers)!
Florian Richoux How to master C++ 18 / 57
Why writing a copy ctor and a copy assignment operator?
Question
Why do we need to (sometimes) write them?
Reformulated question
When do we need to write them?
Answer
Each time you have a class managing resources (like manipulatingmemory, pointers)!
Florian Richoux How to master C++ 18 / 57
Why writing a copy ctor and a copy assignment operator?
c l a s s A {pub l i c :A( ) { i = new i n t ; }i n t ∗ i ;
} ;
A a ;A b = a ;// same s t o r y w i th j u s t b = as t d : : cout << a . i << s td : : e nd l << b . i << s td : : e nd l ;
Output
0x3A28213A0x3A28213A
Florian Richoux How to master C++ 19 / 57
Why writing a copy ctor and a copy assignment operator?
c l a s s A {pub l i c :A( ) { i = new i n t ; }i n t ∗ i ;
} ;
A a ;A b = a ;// same s t o r y w i th j u s t b = as t d : : cout << a . i << s td : : e nd l << b . i << s td : : e nd l ;
Output
0x3A28213A0x3A28213A
Florian Richoux How to master C++ 19 / 57
Why writing a copy ctor and a copy assignment operator?
c l a s s A {pub l i c :A( ) { i = new i n t ; } // c t o r
A( const A& othe r ) { // copy c t o ri = new i n t ;∗ i = ∗( o t h e r . i ) ;
}i n t ∗ i ;
} ;
A a ;A b = a ;// same s t o r y w i th j u s t b = as t d : : cout << a . i << s td : : e nd l << b . i << s td : : e nd l ;
Output
0x3A28213A0x6339392C
Florian Richoux How to master C++ 20 / 57
Why writing a copy ctor and a copy assignment operator?
c l a s s A {pub l i c :A( ) { i = new i n t ; } // c t o r
A( const A& othe r ) { // copy c t o ri = new i n t ;∗ i = ∗( o t h e r . i ) ;
}i n t ∗ i ;
} ;
A a ;A b = a ;// same s t o r y w i th j u s t b = as t d : : cout << a . i << s td : : e nd l << b . i << s td : : e nd l ;
Output
0x3A28213A0x6339392C
Florian Richoux How to master C++ 20 / 57
The copy-and-swap idiom
I explained you:
I What copy ctor and copy assignment operator are.
I When they are called.
I Why it is important to (sometimes) write them.
But I did not explain yet how to implement them properly.
Good implementation
Apply the copy-and-swap idiom.
Florian Richoux How to master C++ 21 / 57
The copy-and-swap idiom
c l a s s MyClass {pub l i c :
MyClass ( s t d : : s i z e_t s i z e = 0) // c t o r: s i z e ( s i z e ) ,
a r r a y ( s i z e ? new i n t [ s i z e ] : n u l l p t r ){}
MyClass ( const MyClass& o th e r ) // copy c t o r: s i z e ( o t h e r . s i z e ) ,
a r r a y ( s i z e ? new i n t [ s i z e ] : n u l l p t r ){ s td : : copy ( o t h e r . a r r ay , o t h e r . a r r a y + s i z e , a r r a y ) ; }
p r i v a t e :s t d : : s i z e_t s i z e ;i n t ∗ a r r a y ;
} ;
http://stackoverflow.com/questions/3279543/
what-is-the-copy-and-swap-idiom/
Florian Richoux How to master C++ 22 / 57
The copy-and-swap idiom
c l a s s MyClass {. . .pub l i c :
MyClass& operator=(const MyClass& o th e r ) // copy asgmt op{
i f ( t h i s != &othe r ){
// put i n the new data . . .s t d : : s i z e_t newSize = o the r . s i z e ;i n t ∗newArray = newSize ? new i n t [ newSize ] : n u l l p t r ;s t d : : copy ( o th e r . a r r ay , o t h e r . a r r a y + s i z e , newArray ) ;
// . . . and get r i d o f the o l d datade le te [ ] a r r a y ;s i z e = newSize ;a r r a y = newArray ;
}
re tu rn ∗ t h i s ;}
} ;
Florian Richoux How to master C++ 23 / 57
The copy-and-swap idiom
c l a s s MyClass {. . .pub l i c :
MyClass& operator=(const MyClass& o th e r ) // copy asgmt op{
i f ( t h i s != &othe r ) // o f t e n u s e l e s s{
// put i n the new data . . .s t d : : s i z e_t newSize = o the r . s i z e ;i n t ∗newArray = newSize ? new i n t [ newSize ] : n u l l p t r ;s t d : : copy ( o th e r . a r r ay , o t h e r . a r r a y + s i z e , newArray ) ;// ( t h e s e 3 l i n e s a r e code d u p l i c a t i o n )
// . . . and get r i d o f the o l d datade le te [ ] a r r a y ;s i z e = newSize ;a r r a y = newArray ;
}
re tu rn ∗ t h i s ;}
} ;
Florian Richoux How to master C++ 24 / 57
The copy-and-swap idiom
c l a s s MyClass {. . .pub l i c :
vo id swap ( MyClass& o th e r ){
s td : : swap ( th i s−>s i z e , o t h e r . s i z e ) ;s t d : : swap ( th i s−>ar ray , o t h e r . a r r a y ) ;
}
MyClass& operator=(MyClass o t h e r ) // no r e f e r e n c e !{
swap ( o th e r ) ;re tu rn ∗ t h i s ;
}} ;
http://stackoverflow.com/questions/3279543/
what-is-the-copy-and-swap-idiom/
Florian Richoux How to master C++ 25 / 57
Memory management
Florian Richoux How to master C++ 26 / 57
The Rule of Three
Rule of 3
If your class needs any of
I a destructor,
I or a copy constructor,
I or a copy assignment operator.
de�ned explicitly, then it is likely to need all three of them.
Put in other words
If your class manages resources, you need to explicitly de�ne:
I a destructor,
I a copy constructor,
I and a copy assignment operator.
Florian Richoux How to master C++ 27 / 57
The Rule of Three
These three are linked
What do a copy assignment operator?
I It copies a new state (copy ctor),
I and it deletes the old state (destructor).
http://stackoverflow.com/questions/4172722/
what-is-the-rule-of-three
Florian Richoux How to master C++ 28 / 57
The Rule of Three
The rule �A delete for each new� is not su�cient!
c l a s s A{
pub l i c :A( i n t i ) : array_ ( i ? new i n t [ i ] : n u l l p t r ) { }~A( ) { de le te [ ] array_ ; }
p r i v a t e :i n t ∗ array_ ;
} ;
A ∗a1 = new A( 4 2 ) ;A ∗a2 = new A( 2 4 ) ;. . .(∗ a1 ) = (∗ a2 ) ;. . .de le te a1 ;de le te a2 ;
Florian Richoux How to master C++ 29 / 57
The Rule of Three
The rule �A delete for each new� is not su�cient!
c l a s s A{
pub l i c :A( i n t i ) : array_ ( i ? new i n t [ i ] : n u l l p t r ) { }~A( ) { de le te [ ] array_ ; }
p r i v a t e :i n t ∗ array_ ;
} ;
A ∗a1 = new A( 4 2 ) ;A ∗a2 = new A( 2 4 ) ;. . .(∗ a1 ) = (∗ a2 ) ; // Memory l e a k !. . . // We have l o s t o r i g i n a l a1 ' s array_de le te a1 ;de le te a2 ; // Unde f ined b eha v i o r !
Florian Richoux How to master C++ 30 / 57
C++11 and move semantics
c l a s s Vector {i n t ∗ s torage_ ;s i z e_t s i ze_ ;
pub l i c :
// c t o rVector ( s i z e_t numElements )
: s torage_ (new i n t [ numElements ] ) ,s i ze_ ( numElements )
{ }
// d to r~Vector ( ) { de le te [ ] s torage_ ; }
} ;
http://kholdstare.github.io/technical/2013/11/23/
moves-demystified.html
Florian Richoux How to master C++ 31 / 57
C++11 and move semantics
http://kholdstare.github.io/technical/2013/11/23/
moves-demystified.html
Florian Richoux How to master C++ 32 / 57
C++11 and move semantics
Vector c = a + b ;
??? operator+ ( Vector const & a , Vecto r const & b ) ;
I Return by value seems bad.
I Return a pointer is bad too: you must make disallocationsomewhere, and can't chained + operations (like a+b+c).
I Return a reference seems not a good idea either.
http://kholdstare.github.io/technical/2013/11/23/
moves-demystified.html
Florian Richoux How to master C++ 33 / 57
C++11 and move semantics
Vector c = a + b ;
??? operator+ ( Vector const & a , Vecto r const & b ) ;
I Return by value seems bad.
I Return a pointer is bad too: you must make disallocationsomewhere, and can't chained + operations (like a+b+c).
I Return a reference seems not a good idea either.
http://kholdstare.github.io/technical/2013/11/23/
moves-demystified.html
Florian Richoux How to master C++ 33 / 57
C++11 and move semantics
Vector c = a + b ;
??? operator+ ( Vector const & a , Vecto r const & b ) ;
I Return by value seems bad.
I Return a pointer is bad too: you must make disallocationsomewhere, and can't chained + operations (like a+b+c).
I Return a reference seems not a good idea either.
http://kholdstare.github.io/technical/2013/11/23/
moves-demystified.html
Florian Richoux How to master C++ 33 / 57
C++11 and move semantics
Vector c = a + b ;
??? operator+ ( Vector const & a , Vecto r const & b ) ;
I Return by value seems bad.
I Return a pointer is bad too: you must make disallocationsomewhere, and can't chained + operations (like a+b+c).
I Return a reference seems not a good idea either.
http://kholdstare.github.io/technical/2013/11/23/
moves-demystified.html
Florian Richoux How to master C++ 33 / 57
C++11 and move semantics
You need to
move!
Florian Richoux How to master C++ 34 / 57
C++11 and move semantics
Is returning by value really bad?
Vector operator+ ( Vector const& a , Vecto r const& b){
// c r e a t e r e s u l t o f same s i z ea s s e r t ( a . s i z e ( ) == b . s i z e ( ) ) ;Vecto r r e s u l t ( a . s i z e ( ) ) ;
// compute a d d i t i o ns t d : : t r an s f o rm (
a . beg i n ( ) , a . end ( ) , // i npu t 1b . beg in ( ) , // i npu t 2r e s u l t . b eg in ( ) , // r e s u l ts t d : : p lu s<i n t >() // b i n a r y o p e r a t i o n
) ;
re tu rn r e s u l t ; // RVO u s u a l l y a p p l i e s}
http://kholdstare.github.io/technical/2013/11/23/
moves-demystified.html
Florian Richoux How to master C++ 35 / 57
C++11 and move semantics
Yes, but...
Reason #1
s t d : : s t r i n g f ( bool cond = f a l s e ) {s td : : s t r i n g f i r s t ( "first" ) ;s t d : : s t r i n g second ( "second" ) ;
re tu rn cond ? f i r s t : second ; // r e t u r n under c o n d i t i o n :// u s u a l l y no RVO
}
Reason #2
RVO applies when one transfers a value out of a scope.What if we need to transfer into a scope?
http://kholdstare.github.io/technical/2013/11/23/
moves-demystified.html
http://en.wikipedia.org/wiki/Return_value_optimization
Florian Richoux How to master C++ 36 / 57
C++11 and move semantics
Transferring value into a scope
Ray computeRay ( ){
Vecto r o r i g i n ;Vecto r d i r e c t i o n ;
. . .
re tu rn Ray (o r i g i n , // COPY!d i r e c t i o n // COPY!
) ; // c e r t a i n l y RVO}
http://kholdstare.github.io/technical/2013/11/23/
moves-demystified.html
Florian Richoux How to master C++ 37 / 57
lvalue Vs rvalue
lvalue
c = a + b;
rvalue
c = a + b;Must be a temporary, non-named value.
http://stackoverflow.com/questions/3601602/
what-are-rvalues-lvalues-xvalues-glvalues-and-prvalues
Florian Richoux How to master C++ 38 / 57
C++11 and move semantics
Vector : : Vecto r ( Vecto r&& othe r )// s h a l l ow copy
: s torage_ ( o th e r . s torage_ ) ,s i ze_ ( o th e r . s i ze_ )
{// n u l l i f y s ou r c eo th e r . s torage_ = n u l l p t r ;o t h e r . s i ze_ = 0 ;
}
http://kholdstare.github.io/technical/2013/11/23/moves-demystified.html
Florian Richoux How to master C++ 39 / 57
C++11 and move semantics
Transferring value into a scope
Ray computeRay ( ){
Vecto r o r i g i n ;Vecto r d i r e c t i o n ;
. . .
re tu rn Ray (s td : : move ( o r i g i n ) , // moved !s t d : : move ( d i r e c t i o n ) // moved !
) ; // c e r t a i n l y RVO}
http://kholdstare.github.io/technical/2013/11/23/
moves-demystified.html
Florian Richoux How to master C++ 40 / 57
The Rule of Four and a Half
When a class manipulates resources
Rule of 4.5
=
Rule of 3
+
de�ne the move ctor(+ de�ne a move assignment operator?)
http://stackoverflow.com/questions/4782757/
rule-of-three-becomes-rule-of-five-with-c11
http:
//stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom
Florian Richoux How to master C++ 41 / 57
RAII and Smart pointers
RAII
Resource Acquisition Is Initialization: release resource automatically.
Some applications
I Files,
I Network sockets,
I Mutex,
I Memory.
Smart pointers std::unique_ptr and std::shared_ptr.
Florian Richoux How to master C++ 42 / 57
Rule of Zero
Rule of 0
Using smart pointers (and RAII principle) to manage resources, no need
to explicitly declare dtor, copy ctor, etc.
You can
rest!
http://flamingdangerzone.com/cxx11/2012/08/15/rule-of-zero.html
Florian Richoux How to master C++ 43 / 57
Rule of Zero
Rule of 0
Using smart pointers (and RAII principle) to manage resources, no need
to explicitly declare dtor, copy ctor, etc.
You can
rest!
http://flamingdangerzone.com/cxx11/2012/08/15/rule-of-zero.html
Florian Richoux How to master C++ 43 / 57
Extra
Florian Richoux How to master C++ 44 / 57
I did not talk about
I const (http://duramecho.com/ComputerInformation/WhyHowCppConst.html)
I Exceptions (and C++11 noexecpt)
I operator+= and operator+ (and operator++ and stu�)
I C++ cast
I Functors
I C++11 features like:
auto,
lambda,
decltype
I C++14
I C++17
Florian Richoux How to master C++ 45 / 57
Safety
Asserts
Use assert. Unable them with the -DNDEBUG compile option.
Valgrind
valgrind �leak-check=full �show-reachable=yes ./your_program
Warnings
Try to solve them!
Florian Richoux How to master C++ 46 / 57
Read!
Books
I E�cient C++ by Scott Meyers (C++11/14 update soon!)
I Exceptionnal C++ by Herb Sutter (C++11/14 update soon!)
Blog
Herb Sutter's �Guru of the Week�http://herbsutter.com/category/c/gotw/
@isocpp@cppstack
Florian Richoux How to master C++ 47 / 57
Use!
Boost library
http://www.boost.org/
<algorithm>
Gotta use 'em all!http://www.cplusplus.com/reference/algorithm/
Florian Richoux How to master C++ 48 / 57
Fonctional C++
John Carmack's blog
http://www.altdevblogaday.com/2012/04/26/
functional-programming-in-c/
Modern Functional Programming in C++
http://zao.se/~zao/boostcon/10/2010_presentations/thu/
funccpp.pdf
C++17: I See a Monad in Your Future!
http://bartoszmilewski.com/2014/02/26/
c17-i-see-a-monad-in-your-future/
Florian Richoux How to master C++ 49 / 57
Template Metaprogramming
Books
I Modern C++ Design by Andrei Alexandrescu.
I C++ Template Metaprogramming by Dave Abrahams andAleksey Gurtovoy.
I C++ Templates: The Complete Guide by David Vandevoordeand Nicolai Josuttis (second edition planned for 2015).
A nice intro
http://www.codeproject.com/Articles/3743/
A-gentle-introduction-to-Template-Metaprogramming
Florian Richoux How to master C++ 50 / 57
SOLID
I Single Responsibility: One reason to exist, one reason to change
I Open Closed Principle: Open for extension, closed for modi�cation
I Liskov Substitution Principle: An object should be semanticallyreplaceable for it's base class/interface
I Interface Segregation Principle: Don't force a client to depend on aninterface it doesn't need to know about
I Dependency Inversion Principle: Depend on abstractions, notconcrete detail or implementations
http://stackoverflow.com/questions/1423597/solid-principles
http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29
Florian Richoux How to master C++ 51 / 57
Repository and comments
svn, git, mercurial, ...
Ultimate combo
GitHub + Travis(http://docs.travis-ci.com/user/getting-started/)
Comments
Comment your code with doxygen
in English!
Florian Richoux How to master C++ 52 / 57
Repository and comments
svn, git, mercurial, ...
Ultimate combo
GitHub + Travis(http://docs.travis-ci.com/user/getting-started/)
Comments
Comment your code with doxygen in English!
Florian Richoux How to master C++ 52 / 57
To make progress
Code!
Teach!
Florian Richoux How to master C++ 53 / 57
To make progress
Code!
Teach!
Florian Richoux How to master C++ 53 / 57
C++ hiring questions 1/3
I How many ways are there to initialize a primitive data type in C++and what are they?
I Why should you declare a destructor as virtual?I What does it mean that C++ supports overloading?I What are examples of overloading in C++?I What is name mangling in C++ and why is it used?I What is an abstract base class?I What is RTTI?I How can you access a variable that is �hidden� by another variable of
the same name?I What is a namespace and how is it used.I What are the di�erences between a class and a struct in C++, and
how does this compare to C?I What are templates? How are they used?I What is a copy constructor and when is it used, especially in
comparison to the equal operator.I What is the di�erence between a �shallow� and a �deep� copy?I What is the const operator and how is it used?
Florian Richoux How to master C++ 54 / 57
C++ hiring questions 2/3
I What are the di�erences between passing by reference, passing byvalue, and passing by pointer in C++?
I When is it and when is it not a good idea to return a value byreference in C++?
I What is the di�erence between a variable created on the stack andone created on the heap?
I How do you free memory allocated dynamically for an array? Whatare the implications of just using delete?
I What is multiple inheritance? When should it be used?
I What is a pure virtual function?
I What does the keyword mutable do?
I What does the keyword volatile do?
I What is the STL?
I What is a Vector?
I What is contained in the <algorithms> header?
Florian Richoux How to master C++ 55 / 57
C++ hiring questions 3/3
I What is the di�erence between #include <iostream.h> and#include <iostream>?
I What's the di�erence between �++i� and �i++�?
I What is short circuit evaluation? How can it be used? Why can isbe dangerous?
I What is the `,' operator?
I What is the only ternary operator? How is it used?
I What is the use of a const member function and how can it be used?
I How is try/catch used in C++?
I Why should you never throw an exception in a destructor?
I What is the explicit keyword?
I What is the proper way to perform a cast in C++?
I What does inline do?
Florian Richoux How to master C++ 56 / 57
Thanks!
Florian Richoux How to master C++ 57 / 57