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