C++ programming
Lecturers: Program:
● Eric Chabert 6 hours of lectures (& tutorials)
● Eric Conte 4 computing sessions (3h each)
with an introduction to the use of
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 1
Goals of that course
The program has been adjusted to your level
It is the first version so it will clearly not be perfect …
.. but we can interact so don't hesitate to stop me & fill free to ask questions
Goals (within the limitation of 6 hours)
(Re)inforce your knowledge &
while( !is_understood(what_I_said)){ understanding of the basis
cout<<explanation<<endl; Give you examples of applications
Highlight “not well known enough”
explanation+=adjustment; features of C++
} Give you guidance for your current &
future developments
Discuss more advanced functionalities
✔ Everything will not be covered
✔ No formal lectures on ROOT or GEANT4 here
✔ It is not an advanced lecture and will not become an C++ expert
You're following a begintermediate condensed lecture
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 2
Why C++ ?
We are looking for scientific application (use of numerical methods,...) and we
want program to run “fast”
It cannot be an interpreted language (ex: python), but a compiled one
We have to deal with a complex environment and to perform well advanced tasks
It must be an oriented object language (ex: java, ...)
We need a language for which tools already exists
It must have libraries (standard or not)
C++ is the (one) answer !
Most of HEP collaborations use C++ for their software developments
C++ is precisely defined by an ISO standard and is available on all OS
Programming concepts that you will learn using C++ can be used in other
languages
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 4
C++: a bit of history
Dennis M. Ritchie Bjarne Stroustrup
C inventor C++ inventor
Both C & C++ were “born” in the Bell Labs
C++ almost embed the C
Many tasks could be done in a C/style or C++/style
Some C/style “procedures” are be to proscribed
C++ has a long history and is still in development
C++11 C11
C++ is less “modern” than java (91),python(93),C#(2000) …
C++14 We will here discuss about C++98 (not C++11)
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 5
Writing a program requires many steps
Preparatory work
Modelisation of the problem
Identification of the algorithms or tools to be used (does appropriate libraries exist ?)
Defining the specifications
Project management: task division/sharing ...
Writing the code
This is not the most time consuming tasks ….
Compilation
From simple one to more complex (use of Makefile)
Debugging (could be time consuming)
Test
Test of every part & functionality of the program
Verification of the code protection (Crash can happen during runtime. Unexpected behavior …)
Optimization [optional]
Could be done with respect to different quantity: cpu time, memory usage, desired precision, …
Utilization
Private/Restrictive/Public usage ? … feedback to come ...
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 6
What is the language made of ?
Types (bool, int, float, char,...)
Expression and statements
Selection (if/else, switch,..)
Iteration (while,for,...)
Functions (“intrinsic” or user-defined)
Accessible via libraries
Containers (vector,map,..)
Accessible via libraries
With those ingredients, you can do a lot of things ….
...
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 7
“Hello world” example
Only one “main”
function per executable
Header files Return an integer that can used
Preprocessor directive by the system
main.cpp
#include <iostream>
Type
Variable declaration
int main() { Variable affectation
float x; //declaration
int i=3; //declaration and affectation
std::cout << “Hello world” << std::endl;
std::cout <<”i=” << i << std::endl;
return 0;
Input/Output
} Terminal
Namespace
It is already a “rich” example !!
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 8
Variable and types
Several types could be accessible
Build-in types:
Ex: bool, int, float, double, char
Standard library types:
Ex:complex, string, ...
Specific libraries:
Ex: (Root) Float_t, TString, TH1F
User defined types:
your own classes
On the machine, everything is only bits filled with 0/1
“Type” is what interprets bits and give them meaning !
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 9
build-in type
Type representation (number of bits used) depends on the platform
Ex:
Ex on my computer (icore7, 64 bits)
type content size range
bool True (0) ou False (1) 8 bits
short Signed integer 16 bits [-32768,32767]
int Signed integer 32 bits [-2147483648,2147483647]
long Signed integer 64 bits [-9223372036854775808,92233720368547]
float floating-point 32 bits de 1.4E-45 à 3.4E+38
double floating-point 64 bits de 4.9E-324 à 1.8E+308
char ASCII char 8 bits [0,255]
Sign uses 1 bit – “unsigned” type have double possible value
Once you “declare” a variable of a given type, you allocate memory
Build-in type goes on the stack
fast access
available during the whole existence of the program
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 10
Standard library types
String
“Extension” of character chains
Discussed later in the course
Headers:
#include <string>
#include <complex>
complex<Scalar>
complex<double>
complex<float>
.. it's an example of “template class”
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 11
Types defined in other libraries
Headers:
#include <boost/cstdint.hpp>
int_least8_t
int_least16_t
int_least32_t
uint_least8_t Will ensure the number of bits used on
the machine (portable)
uint_least16_t
uint_least32_t
...
Headers:
#include <Rtypes.h>
Int_t
UInt_t
Double_t (basic) types can be (re)defined by specific library
Double32_t ….
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 12
Comments & documentation
To comment the end of a line: // Instruction; // Here starts the comment
To comment a block of lines: /* block */ Instructions;
/* The following lines are inactive
for(int i=0;i<10;i++){
i = i*10;
}
Comments are really useful */
Comment what variables represents (names are not always sufficient)
Comment functional block
● Ex:
Ex reading input, computing a sum, writing an output, ...
Comment the program, the functions (.h), the classes (.h)
● Explain the goals, the input, the output, the main algo ...
Commenting is not a lost of time.
time
It will be useful for you already few weeks after coding
but also for your co-developers or future users of your code !!!
Tools for documentation formatting exists, ex: doxygen
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 13
Usage of variables
Declaration
required int i;
Precise the type of the variable
Initialization
i=0;
Strongly recommended int j=10;
Can lead to unexpected behavior otherwise
Float x = 103.4;
Declaration & Initialization can be done at once Float y = 1.034e2; //e ou E
Affectation i=j; //affectation int i=23;
i = i*2+1; short b = (short) i; //C-like
Operations i=j**2+3*j; short b = i; //C-like
Short b = static_cast<short>(i); //C++ like
Conversion i= (int) 10.6; // will be truncated
Implicit (explicit) Float f = 10.6;
i = static_cast<float>(f); //C++ like
Truncated numbers
Other features ... float a = 3.2;
int i = 1/a;
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 14
Declaration and initialization (II)
Declaration:
introduce a name into a scope
specify a type for named object
sometimes it includes an initialization
a name must always be declared before being used (compilation error otherwise)
Initialization:
Syntax depends on the type (see examples above)
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 15
Variables: operations
Arithmetic operations Arithmetic operation Arithmetic/Affectation
+ addition += add
Affectation - soustraction -= subtract
Comparison operations * multiplication *= multiply
/ division /= divide
Boolean operations
% modulo %= modulo
Pre and post in(de)crement -(unaire) opposed
In/De crement Comparison operators
i++ post-increment
== equality
i-- post-decrement
!= difference
++i pre-increment
> ; >= Greater than(or equal)
--i pre-decrement
< ; <= Lower than (or equal)
4 equivalent incrementation:
a=a+1; “Concise operators” are generally better to use
a+=1;
a++; a+=c ↔ a=a+c
++a; a*=scale ↔ a=a*scale
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 16
Integer representation
Bitwise operators
not only applicable to integers
& AND
| OR
^ XOR (exclusive or)
int - max value = 231 - 1 ~ NOT – inversion of the bit
unsigned int - max value = 232 - 1
<< Left shift
int a = 4; // coded ...000100 >> Right shift
a=a<<3; // coded ...100000
cout<<”a=”<<a<<endl;
a=32
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 17
Floating Point representation
Real (float & double) are actual mainly represented using floating point
representation following the norm IEEE-754.
Representation: (-1)S x m x be-E
S: sign
M: mantissa
B: base
E: exponent
Reals are obviously discretely
represented on computers
Absolute precision evolve with the value of the variable
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 18
Expressions
Boolean type expression
Equality operators == equal
!= Not equal
Logical operators && and
|| or
! not
Relation operators < Less than
<= Less than or equal
> Greater than
>= Greater than or equal
All those expressions can be combined
also with the help of ()
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 19
Precision & numerical uncertainty
Representation
The value you could want to represent might not be represented (approximation)
Float a = 1;
Float b = 3;
Float c = a/b
cout<<”c=”<<c<<endl;
c=3.33333333333333315e-01
Truncation
The result of a computation involving two well defined represented numbers can lead to a
truncated number
“Reduced” variable (close to 1)
This is equivalent to performance a change of variable with dimensionless variable
Subtraction of two variables having big difference will lead to a high uncertainty
Expressions being analytically equal will not necessarily give the same numerical results
First step before implementing
a formula is to choose the
the better expression (lowest uncert.)
(a2-b2)/(a-b)!=(a+b) ?
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 20
Precision & numerical uncertainty
Precautions & tests:
Division by zero:
will lead to a crash – test the denominator first
Division of integer
Ex:
Ex float a = 1/3; // a = 0 !! - at least numerator of denominator should be an float
Equality test of reals
It might be better to test a small difference ε between the two variables (truncature pb)
Stl offers tools to perform test on numbers
Isinf // test for infinite
Isnan // NAN = Not A Number
// all combinations of bits doesn't represent a number (float/double)
...
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 21
Simple examples
Floating-point numbers are approximation of real
numbers
Can lead to numerical errors (quantification?)
0.999999
Integer types represent integer up to a certain limit
Overflow problem
-25536 -727379968
Integer and real numbers are infinite while the number of bits to represent is definitively finite !
Remember this while applying numerical methods
Lost of precision for large integer values
troncature problem
5.7
5.7 55
Implicit conversion float to integer
truncature problem 1.23456790519e+17 123456789123456789
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 22
Type-safety violation
C++ doesn't prevent you from trying to
put a large value into a small variable
(though a compiler may warm)
Implicit narrowing
30000 48 0
In memory, everything is just bits: 01100001
Type is what gives meaning to bits:
01100001 is the char 'a'
char: a integer: 97 01100001 is the integer 97
x:4196320 c: d:6.95315e-310
Always initialize your variable !!
Valid exception: input variable
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 23
STL: Standard Template Library
C++ offers a very useful library than can be used: STL
It offers solutions in various aspects:
Defining containers
Providing algorithms
Input/Output
More details later in the course
Most of the “tools” (variables, functions, classes,...) are defined in the
namespace std
To give access to those functionalities, one need to include file
Ex:
Ex #include <iostream>
To use it, one need to specify the namespace
Ex:
Ex std::cout
Or using namespace std; and then cout (no need to precise the namespace)
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 24
Numerics: standard functions
There are already a lot of “tools” in the STL that can Headers:
helps you in your implementation (and tests) #include <cmath>
From http://www.cplusplus.com/reference/cmath/
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 25
Mathematical libraries:
standard functions
Headers:
#include <cmath>
You've certainly already used some
of them.
Other are less well know but might
be useful for you in a future project
...
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 26
Do not reinvent the wheel !
A lot of things are already available in the stl
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 27
A simple example
Let's consider the problem of looking to the smallest element of a std::vector
#include <vector>
#include <limit>
#include <algorithm>
A lot of “common problems” have been treated and implemented by more
experimented C++ developer that you:
Why won't we use their tools ?
Once you have a project, first check on the existing tools (lib) if a
solution have been already developed.
If yes, it will let you know time to concentrate on the specificity of your
current project and also time to analyze your results !
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 28
Const variables
It is not a good idea to have “magic numbers”, “hardcoded values”.
When reviewing your codes, you should change them (better to be done at first implementation)
Many possibilities:
The value is a parameter:
user can change it (cin, file, ...)
Int nof_channels = 0;
cout<<”Enter the number of channel:”<<endl;
cin>>nof_channels;
The value is redefining by a macro alias:
#define NOF_CHANNELS 12
The value can be a constant !
const int nof_channels = 12;
Initialization should come with definition
The value is protected and could not be changed later on the program
Attempts to change the value will lead to compilation error
It is useful to define as const variables many kind of variables:
mathematical/physical constants: π,G, ε0
constants variables of your software: number of channels, ...
It helps for the meaning: 12 doesn't mean anything while nof_channels does !
It avoid numerical problems:having dependent on the number of digits: 3.14!=3.14159265
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 29
Static variable
Static variables keep their values and are not destroyed even after
they go out of scope
Can be useful for incrementation by example
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 30
Coding rules: name of variables
C++ Rules: Are forbidden:
● _x
starts with a letter
● 12x
● Time.Acquisition@CERN
only contains letters,digits, underscores ● My Variable
● ...
cannot use keywords names (if, int, ...)
Recommendations
Choose meaningful names
● Avoid confusing abbreviations and acronyms
● Use conventions (i,j,k as loop indexes by example)
Avoid overly long names the_number_of_channels // too long
nof_channels // shorter and meaningful
Nofc; // what does it mean ??
You could define your own rules (or the own of your team)
● Use of capital letters, underscore
● Examples
– ROOT class names starts with a “T” (ex:TGraph)
– variable with a “f” (ex: fEntries)
– Accessors starts with “Get” (ex: histo->GetXaxis() )
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 31
Instructions
Selection (if/else) Loop: for
if( test){ for(initialize,condition,increment){
Instructions1; instructions;
} }
elsif(test2){ // optional Initialize: ex: int i=0;
Instructions2; Condition: ex: i<10
} Increment: ex: i++ (i=0 at it. 1)
else{ ++i (i=1 at it. 1)
Instructions3; For is used when the number of
} // brackets not needed if Iterations is well defined
// there is only one line (ex: summation of all elements of an array/vector)
Ex:
Ex if(a>b) max=a; Loop: while
else max=b;
while(condition){
Condensed syntax Instructions;
}
test ? Inst1: Inst2 ; While is mandatory when the number of
Iterations is not know before running time
Ex:
Ex (a>b)? max=a: max=b; (ex: minimization problem)
do{
do
Instructions;
}
while(condition)
while
Eric.Chabert@cern.ch ESIPAP - 2013 – moduleEnsure
1 Programming/C++
that instructions are run at least once 32
Control commands
Break
Allow to stop a loop
Continue
Allow to bypass a section of code
Used in loops to go directly to next iteration
Return
Ends a function (Ex:
Ex main)
Can be followed by a variable
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 33
Precedence and associativity
Operator precedence determines which operator will be performed first in a group of
operators with different precedences
Ex:
Ex 5+3*2 computed as 5+(3*2) = 11 ant not (5+3)*2 = 16
The operator associativity rules define the order in which adjacent operators with the
same precedence level are evaluated
8-3-2 computed as (8-3)-2=3 and not 8-(3-2)=7
Max priority
To ensure that you're calculus will be
performed as you expected, you can
always add parentheses.
Nevertheless it is better to not
“overload” you code with
unnecessary ()
From http://n.ethz.ch/~werdemic/download/week3/C++%20Precedence.html
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 34
Input/Output
INPUT:
Keyboard (default)
Files
Data base
Other input device
Other programs
Other part of a program
Code
Make some computation
partially based on the input
(if any) and produce
an output !
OUTPUT:
Screen (default)
Files
Data base
Other input device
Other programs
Other part of a program
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 35
Input and Output
./prog.exe > log.stdout # redirect only cout streams
./prog.exe 1> log.stdout # idem
./prog.exe 2>log.stderr #redirect cerr streams
./prog.exe 2>/dev/null #avoid having cerr streams on screen or in a fil e
./prog.exe > log.txt 2>&1 # redirect cout & cerr streams
./prog.exe &> log.txt #idem
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 36
I/O and types
Separator can be a space or a new line
Correct behaviour:
Input: 1 3.4 a toto
Output: int: 1 float: 3.4 char: a string:
toto
Input: 1 3.4 1 3.4
Output: int: 1 float: 3.4 char: 1 string: 3.4
Bad input can lead to errors and stop the program “Undesired” behaviour:
Ex:
Ex Enter a character for an integer or a float Input: 1 3.4 abc toto
Output: int: 1 float: 3.4 char: a string:
Input: 1.2 a toto
It can also lead to unexpected behaviour Output: int: 1 float: 0.2 char: a string:
One should protect the code for this ! toto
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 37
I/O and types
Separator can be a space or a new line
Correct behaviour:
Input: 1 3.4 a toto
Output: int: 1 float: 3.4 char: a string:
toto
Input: 1 3.4 1 3.4
Output: int: 1 float: 3.4 char: 1 string: 3.4
Bad input can lead to errors and stop the program “Undesired” behaviour:
Ex:
Ex Enter a character for an integer or a float Input: 1 3.4 abc toto
Output: int: 1 float: 3.4 char: a string:
Input: 1.2 a toto
It can also lead to unexpected behaviour Output: int: 1 float: 0.2 char: a string:
One should protect the code for this ! toto
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 38
I/O types
“cout” can redirect all built-in types and some std library types (string, complex,...)
<< operator can also be overloaded to any user-defined type !
You can define the desired precision
Precision of the value and printing it are different things.
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 39
I/O types
List of special characters:
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 40
Go further: Fancy cout !
Bold: 1
Underline: 4
Text color: 30+x
Background color: 100+x
Although these features might be amazing, there are not deployed/available on
all systems
This illustrates an other problem, having a portable code :
Support on most compilers
Support on most O.S.
This is not always a request for physicists but it depends on the case.
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 41
Files: input/output
Input file: ifstream #include <ifstream>
Reading can be performed:
Per line: getline()
Per character(s): get()
Ignore characters: ignore()
Read buffer: read(), readsome()
Depending on a format: operator>>
Check state flag:
eof(): check the end of file
good(): state of stream is good
bad(): true if a reading or writing operation fails
fail(): true is bad() and if a format error happens
Many more possible options. Check documentation !
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 42
Files: input/output
Output file: ofstream #include <ofstream>
Opening modes:
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 43
Functions
Functions represent/implement computations/algorithms
Return type (int, void )
Return one variable at maximum
Void means don't return a value
Type can be an user-defined class
Name body
“Arguments” or “parameters”
(last) parameters can have default
value
Body
(in the definition)
Possibility to declare many functions with the same name
in the same scope if they have different arguments (number,type)
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 44
Function: call by value, ref, ...
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 45
Functions: guidance for arguments
Use call-by-value for small objects only
Use call-by const-reference for large objects
Return a result rather than modify an object through a reference
argument
Use call-by reference only when you have to
Ex:
Ex case of multiples outputs
Be careful with the use of pointers
Take care of deletion
Modification of the pointer
Modification of the pointed value
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 46
int main(int argc,char** argv)
It might be convenient to “transmit” information to the
program from the command line
It avoid to recompile the code to change its execution
It might avoid to read configuration file
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 47
int main(int argc,char** argv)
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 48
Call system
Invokes the command processor
Warning: the command called is system/library dependent !
Possibility to parse the output value BUT not the output of the
command
Could be convenient for many applications:
Compile generated latex code
Manipulation of files/folders
...
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 49
Compilation chain
Accessible in open source packages: dev
Sources files
= Give you access to at what is declare
Header files (.h) You don't care about how it is implemented
#include in
Declaration: clu
Variables, enum, struct, sio
n
s ion Classes
c lu Functions
in
… The main program
#include<...>
Sources files: compilation
.cxx or .cpp executable int main(){
...
Definitions and return 0 ;
linking }
implementation
● .o files
● Or libraries:
➔ Static: .a
➔ Dynamic: .so (.dll)
Compilation
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 50
Compilation chain
Example of one class (class.h & class.cpp file) and a main program (main.cpp)
class.cpp will be recompiled even
1 step compilation
if only main.cpp changed
g++ class.cpp main.cpp -o main.exe
2 steps compilation
First line can be omitted if only
g++ -c class.cpp
main.cpp changed
g++ class.o main.cpp -o main.exe
2 steps compilation + use of libToto.so
Toto.h is in headerDir
libToto.so is in libDir
LibDir might be in $LD_LIBRARY_PATH
g++ -c class.cpp
g++ -I headerDir -L libDir -lToto class.o main.cpp -o main.exe
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 51
Compilation chain
2 steps compilation + use of ROOT lib.
g++ -c class.cpp `root-config --cflags --glibs`
g++ class.o main.cpp -o main.exe `root-config --cflags --glibs`
“3 steps” compilation with shared library
g++ -c class.cpp # do the same for other classes
g++ -fPIC -shared class.cpp -o libPerso.so
g++ main.cpp -o main.exe -L libPersoDir -lPerso
To know the symbols inside .so
nm -s --demangle libPoint.so
To list shared library dependencies:
ldd main.exe
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 52
Few compilation options
Previously listed
-o outputfile
Warning options
-Wall: combination of many warnings …
-Wfloat-equal ….
Debugging options
-g: produce debugging info that could be used by the debugger program GDB
Optimization options: following options are needed to speed-up execution time
WARNING: by default compiler try to reduce compilation time
-01 (space/speed tradoff) -O2 (speed opt.) -O3 (inline,regist.) -Os (-02 + code size reduction)
Linker options:
-L libdir -llibrary -shared (to create .so)
Compilation report:
-ftime-report -fmem-report
Preprocessor options
...
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 53
Makefile
Makefile Using variables & comments
make # or make all
Parallelization can be useful
for big projects
make -j NofNodes
.o files are not reproduced (compilation) if .cpp
doesn't change
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 54
Scopes
Global scope (accessible everywhere)
Class scope
Local scope (between {..}: loop, functions,...)
Statement scope (in a for-statement) int x; // global variable – avoid those where you can
int y; // another global variable
int f() {
int x; // local variable (Note – now there are two x’s)
x = 7; // local x, not the global x
{
int x = y; // another local x, initialized by the global y
// (Now there are three x’s)
x++; // increment the local x in this scope
}
Remarks }
// avoid such complicated nesting and hiding: keep it simple!
A name in a scope can be seen from within its scope and within scopes nested within that
scope
A scope keeps “things” local
Prevent var. and functions to interfere with outside
Keep names as local as possible
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 55
Namespaces
A namespace is a named scope
The syntax :: is used to specify which namespace you are using and which (of many
possible) objects of the same name you are referring to
Ex:
Ex You want to create your own class “string”. But it already exists …
● std::string will refer the class implemented in the stl
● your_name_space::string will refer to your own implementation
How to create my namespace ?
You can encapsulate things (functions, classes, enums, …) as following
namespace Xproject{ // create a namespace called Xproject
const double pi = 3.14159; // variable
double square(double a) {return a*a;} // function
class X{ // class
//...
};
}
How to avoid calling everywhere the namespace ??
Ex:
Ex using std::cout;
Ex:
Ex using namespace std;
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 56
Pointer & address
You can get a pointer to any object (from bool to TH1F)
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 57
Pointer & reference
You can't modify an object through a const reference
You can't make a reference refer to another object after initialization
(difference from a pointer)
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 58
Pointer & reference
Pointer Reference
Must be no yes
initialized
Can be null (=0) yes no
Can change the yes no
“pointed”
variable
Can change the yes yes
value of the (no if (no if
“pointed” type* const) const type &
variable
Can delete the yes no
memory
There shall be no references to references, no arrays of
references, and no pointers to references.
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 59
Pointer & reference: Memory
Reference is an alias !
the size in memory of a pointer depends on the platform where the program runs
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 60
Test on pointer
It is always safer to test is a pointer is not null before accessing the pointed variable !
Could be useful to not allocate and delete twice memory (see example below)
Tests on pointers:
Pointer==0
!Pointer
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 61
Arithmetic of pointers
Several operators are also defined for pointers: ++, --
It will allow you to change the address and by consequence the
pointed “object”
The result of those operations are not guaranteed and protection have
to be written
The operation depends on the kind of object type used
int* ptr;
var[0] var[1] var[2] ++ptr move by 4 octets
4 octets double* ptr;
++ptr move by 8 octets
ptr
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 62
Arrays
It's all that C has – It's mainly used in many C++ packages
Array don't know their own size
Often use their size as an arguments in functions
Access to elements
First element has index 0. Ex: tab[0]
Avoid arrays whenever you can:
largest source of bug in C and (unnecessarily in C++)
among the largest source of security violations:
● Possibility to access non declared memory (runtime error or unexpected
behavior)
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 63
Arrays: initialization
It is safer to always initialize the arrays !
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 64
Array: dynamical allocation
Possible memory leak ….
Always free memory:
when it will be not used anymore
when you still have access to the pointer !
when you are “owner” of the 'memory' (pb of double free)
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 65
Array and pointer
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 66
Array and pointer
void f(int pi[ ]) // equivalent to void f(int* pi)
{
int a[ ] = { 1, 2, 3, 4 };
int b[ ] = a; // error: copy isn’t defined for arrays
b = pi; // error: copy isn’t defined for arrays. Think of a
// (non-argument) array name as an immutable pointer
pi = a; // ok: but it doesn’t copy: pi now points to a’s first element
// Is this a memory leak? (maybe)
int* p = a; // p points to the first element of a
int* q = pi; // q points to the first element of a
}
1st
pi:
2nd
a: 1 2 3 4
p:
q: from B. Stroustrup slides
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 67
Array and pointers
char* f()
{
char ch[20];
char* p = &ch[90];
// …
*p = 'a'; // we don’t know what this’ll overwrite
char* q; // forgot to initialize
*q = 'b'; // we don’t know what this’ll overwrite
return &ch[10]; // oops: ch disappears upon return from f()
// (an infamous “dangling pointer”)
}
void g()
{
char* pp = f();
// …
*pp = 'c'; // we don’t know what this’ll overwrite
// (f’s ch is gone for good after the return from f)
}
from B. Stroustrup slides
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 68
Arrays & scope
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 69
Dynamic allocation
In some application, all memory needs cannot be determined before program
execution by defining the variables needed.
In that case, it is determined during runtime.
Ex:
Ex depends on user input(s), depends on the result of a calculus, ...
Operators new and new[]
build-in types
Classes (lib/user)
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 70
Delete: free memory
in most cases, memory allocated dynamically is only needed during specific periods of
time within a program; once it is no longer needed, it can be freed so that the memory
becomes available again for other requests of dynamic memory.
This operation should be performed when variable is still in the scope
End of a loop or function
In the destructor of a class (if memory has been allocated in the constr.)
At the end of a program
Operators delete
delete: delete a single element in memory
delete[]: delete an array of elements
Pointer is not null after delete
You could do it yourself to ensure future test on pointers
You can't delete twice memory: double free exception
If you have 2 pointers on the same element, make sure that only one of them will be deleted
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 71
std::vector
Vector in C++ supersedes array defined in C
There are still a lot of applications using arrays rather than std::vector
It properly deals with dynamic memory
When vector is destructed, all its elements are deleted
Important: the size of the vector is one of the data member of a
std::vector ( contrary to an C array)
Size is not fixed. Can be changed during program execution !
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 72
std::vector
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 73
Ex: vector – pointer – delete
vector glob(10); // global vector – “lives” forever
vector* some_fct(int n)
{
vector v(n); // local vector – “lives” until the end of scope
vector* p = new vector(n); // free-store vector – “lives” until we delete it
// …
return p;
}
void f()
{
vector* pp = some_fct(17);
// …
delete pp; // deallocate the free-store vector allocated in some_fct()
}
it’s easy to forget to delete free-store allocated objects
so avoid new/delete when you can
from B. Stroustrup slides
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 74
std::string
std::string is a class that deals with character chains
It “supersedes” char* (inherited from C)
Many operations are easily possible
Access to size
Find a element
Retrieve a sub-string
Replace elements
Swap elements
...
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 75
string
Many others things are possible
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 76
Int/float ↔ char* conversion
Char* to number conversion : #include<stdlib.h>
Atof: convert char* to float
Atoi: convert char* to int
This is a common problem
Above solution is coming from C, but we can used C++ tools (next slide)
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 77
stringstream and conversion
#include <sstream>
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 78
Preprocessor
Preprocessor directives are preceded by # (only a single line)
No use of semicolon to end the directive
The preprocessor examines the code before the compilation
#define identifier replacement (#undefine)
It only replaces any occurrence of identifier
Define a value
Define function macros with parameters
#undefine: ends the definition (could be used before changing the def.)
Conditional inclusions
#ifdef Avoid multiple
#endif file inclusion
#if #else #elif
#include
#include <header>: provided by the installed libraries (stl,...)
#include “file.h”: could be everywhere not only the installed packages
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 79
Preprocessor: predefined macros
Predefined macro names
Those macro might be useful for exception and error tracking
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 80
Preprocessor: predefined macros
Predefined macro names
Those macro might be useful for exception and error tracking
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 81
Struct
A struct is a group of data elements grouped together under one name.
These data elements, known as members, can have different types and different
lengths
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 82
Oriented Object
What is an object ? (Ex: vehicle)
Defined by its properties (Ex:
Ex number of wheels, ...)
Defined by its actions (Ex:
Ex driving, honking,..)
Objects can interact (Ex:
Ex blinking)
We can have many objects of the same type (instances)
We can have different category of object “inheriting” from the same
mother category (Ex:
Ex motorcycle, car, bus, truck …)
Object can interact with object from another category ( Ex:
Ex driver, ...)
Definition of an object is already an “abstract concept”
Oriented Object Programming is a powerful tool that allows things that
might be difficult to implement with a procedural language
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 83
Class
Represent directly a “concept” in a program
Ex: vector, matrix, string, picture, histogram, particle, detector,...
It is a user-defined type that specifies how objects of its type can be
created and used (and deleted)
Classes are key building blocks for large programs
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 84
Minimal class
point_2D.h
point_2D.cpp
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 85
Minimal class
Compilation:
#creating a point_2D.o (compiled code)
g++ -c point_2D.cpp
#creating an executable
g++ -I. -o main.exe point_2D.o main.cpp
# -I. Is needed to be able to access point_2D.h
# -o is needed if you want to specify the name of your executable (a.out by default)
# code is “linked” to point_2D.o
main.cpp
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 86
Struct vs class
struct class
Contain Yes Yes
variables Public Private by
default
Initialization Done Done by
“manualy” (default)
constructor
Contain No Yes
methods Could define Possible
external private
functions, all methods
public
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 87
constructor & copy constructor
point_2D.h point_2D.cpp
main.cpp
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 88
Operators overload
Mathematical operators
point_2D.h
+,-,*,/,%
+=,-=,*=,/=,%=
point_2D.cpp
main.cpp
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 89
Operators overload
Comparison: point_2D.h
== , !=
>, >=,<,<=
point_2D.cpp
main.cpp
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 90
Operators overload
Flux operators: <<, >>
point_2D.h
point_2D.cpp
main.cpp
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 91
Pointer & classes
Pointer “this”: pointer to the current instance of the class
Pointers to other classes:
Take care to the construction, copy constructor & destructor
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 92
Inheritance
Example from http://www.cplusplus.com
Base class
Derived classes
Rectangle & triangle have common properties
They are both polygons.
hts
ri g
s
c es
Ac
Rule of the “most restrictive access :
If class Rectangle: protected Polygon, the Public members of
polygon would have been “protected” (not accessible) in Rectangle
In principle, a derived class inherits every member of a base
class except:
its constructors and its destructor
its assignment operator members (operator=)
its friends
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 93
Polymorphism
One of the key features of class inheritance is that a pointer to a derived class is type-
compatible with a pointer to its base class.
Polymorphism is the art of taking advantage of this simple but powerful and versatile feature
Only members inherited from Polygon can be accessed
from ppoly1 & ppoly2 and not those of the derived class
If int area() had been defined in Polygon with a different
implementation from the derived class:
Rect.area() and ppoly->area() would have given
different results !!
Polymorphism might be useful by example to create a vector of pointer to polygon
whatever are the derived class of objects
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 94
Virtual methods
Int area() method can be redefined in all derived classes
ppoly1->area() refer to the method defined in Rectangle and
not in Polygone !
This wouldn't have been the case if the methods would have
not been virtual
The destructor of the base class (here Polygon), should be
virtual. If not, the destructor of the base class will be called
but not the one of the derived class, resulting in resources
leak (for memory allocated in the derived class).
A class that declares or inherits a virtual function is called a polymorphic class
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 95
Abstract base classes
Can only be used for base classes allowed to
have virtual member function without definition
Those functions are called virtual functions
definition is replaced by “=0”
Int area() have to be defined in all derived
function inheriting from Polygon
Classes that contain at least one pure virtual function are known as
abstract base classes
Abstract base classes cannot be used to instantiate objects but pointer
of abstract base class is valid !
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 96
Polymorphism
Since Base's destructor is not virtual
and b is a Base* pointing to a Derived
object, delete b has
undefined behaviour. In most
implementations, the call to the
destructor will be resolved like any
non-virtual code, meaning that the
destructor of the base class will be
called but not the one of the derived
Those features can be applied to arrays ofclass,
objects or dynamically
resulting allocated
in resources leak. objects.
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 97
Static members
Static member variables only exist once in a program regardless of
how many class objects are defined!
One way to think about it is that all objects of a class share the static
variables.
Initializer
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 98
Static methods
static methods are not attached to a particular object, they can be
called directly by using the class name and the scope operator.
Like static member variables, they can also be called through objects
of the class type, though this is not recommended
In the implementation of those functions: access to pointer this and to
non static data members is forbidden
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 99
enums
Enumerated types are types that are defined with a set of custom
identifiers (=”enumerators”), as possible values.
Objects of these enumerated types can take any of these enumerators
as value
Value are always assigned to an integer numerical equivalent
internally, of which they become an alias.
If it is not specified otherwise, the integer value equivalent to the first
possible value is 0, the equivalent to the second is 1
Examples of applications:
Colors
Months
Gender
...
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 100
enums can also be defined in class
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 101
Example with ROOT: TH1F
multiple inheritance
Short extract of the public methods ….
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 102
An example: TH1F
Use of enums Data members are protected
Variable are comments
Use “rules” for name
Use of static variable
Pointers are also used
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 103
Another example:TLorentzVector
TLorentzVector is a general four-vector class, which can be used either for the description
of position and time (x,y,z,t) or momentum and energy (px,py,pz,E).
Inheritance
Many constructors
Class: TLorentzVector
Header: #include “TLorentzVector.h”
Library: libPhysics
Overloaded operators
Importance of the documentation
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 104
Type casting
Type casting Can lead to code that while being syntactically
correct can cause runtime errors or give undesired
results
const_cast Manipulates the constness of the object pointed by
a pointed, either to be set or to be removed
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 105
Run-Time Type Information
(RTTI)
It can be applied on any build-in type or user-defined class
typeid uses the RTTI to keep track of the type of dynamic objects.
When typeid is applied to an expression whose type is a polymorphic class, the
result is the type of the most derived complete object
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 106
Type casting
dynamic_cast
Can be used with pointers and references to classes.
Ensure that the result of the type conversion points to a valid complete object of the
destination pointer type.
Pointer is null (==0) if the cast failed
Upcast: converting from pointer-to-derived to pointer-to-base classes
in the same way as allowed as an implicit conversion.
Downcast: converting from pointer-to-base to pointer-to-derived polymorphic classes
if -and only if- the pointed object is a valid complete object of the target type.
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 107
Friendship
Friend methods
Friendship methods A non-member method can access the private and protected
members of a class if it is declared a friend of that class
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 108
Friendship
Friend class
Friendship methods An object from a class A can access the private and protected
members of a class B if it is declared a friend of that class
class Rectangle is a friend of class Square
BUT
class Square is a friend of class Rectangle
Rectangle methods can access to square
private/protected members
Be cautious while
using friendship ...
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 109
Function template
Allow a generalization of a given “idea” to many different input types
Ex:
Ex you want to generalize the computation of a sum.
Instead of having implementation for int, float, double …
you implement it once
Compilation error if you apply it to an incorrect type
Ex:
Ex operator + is not defined for all user-defined type
Ex: % is define for int but not for double
T: template
parameter name
Explicit
specification of
Implicit specification is possible if unambiguous
type T Ex:
Ex Sum(2,3)
Template with many several template types is possible
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 110
Class templates
“Famous” examples from the STL
Template specialization possible
Ex: vector<bool>
Everything should be “rewritten”
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 111
Exceptions
Exceptions provide a way to react to exceptional circumstances (like
runtime errors)
Protect parts of the code
Return an error message & decide what to do (abort the program ?)
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 112
Exceptions
“standard” exceptions already managed
Possibility to create your own class
inheriting from std::exception (see
example above)
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 113
Basic programming rules
Indentation of the code (more readable ..)
Respect conventions for the variable name (and even more generally)
Always initialize variables
Be cautious with
Integer division
Type Casting
Usage of array
Dynamical allocation & delete
Comments
Documentation ( possibility to use tools such as “Doxygen”)
Code protection and exceptions
Test on variables, pointers ...
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 114
Computation
Developer goal is to express computation
Correctly // means code protection ...
Simply // means use the appropriate variable name, syntax, functions, lib, ..
Efficiently // different options (cpu, memory, fiability, …)
Organization of the code (cf UML)
Divide big computations into many little ones (functions, classes)
Avoid duplication
Abstraction: provide a higher level concept that hides details
Usability:
User-friendly: documentation, comments, abstraction
Organization of the data:
Input/output format User build-in types, if not sufficient use library
types and if it doesn't fit your goals, define your
Protocols: how it communicates own class
Data structure For your computation, check if existing libraries
does not fit your needs
And in all cases, don't reinvent the wheel
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 115
Programming
First step is the conception
Start with a simple & robust implementation
Than perform intensive tests:
Should produce the desired results for all legal inputs
Should give a reasonable error messages for illegal inputs
Review your code
Code cleaning: remove useless variables, ...
Style: Comments / naming & coding rules / documentation
Maintenance: use of functions / parameters instead of “magic numbers” ...
Let a colleague review your code
Only then, add features. Go to a “full scale” solution based on 1st impl.
It will avoid problems, delay, bugs, ...
Code can be used by users in a largest community ...
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 116
UML: Unified Modeling Language
General to all oriented object language
It is a modelization language
Allow to deal with complexity
It can be a first step (conception) before implementation of the code
Guidance: OMG UML: http://www.omg.org
Will be more discussed during the computing sessions
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 117
Optimization
Having a code properly functioning is clearly the first and most important feature !
But in many application, memory or CPU-cunsumption might be a bottleneck. In
that cases, optimization would be required.
Control of execution time (<ctime>,<chrono>, or even a simple time ./a.out)
Even if it is a whole topic by itself, this is few basic direction to follow
Prefer reference to pointer
Parameters might be reference (no copy)
Take advantage of stl containers
Avoid extensive usage of RTTI & Exception handling
Initialization is faster than assignment
Use inline functions in the most simple case
Compiler options can also help for optimization
...
Eric.Chabert@cern.ch ESIPAP - 2013 – module 1 Programming/C++ 118