Transcript Document
GETTING STARTED WITH
C++
Christian Schulte
[email protected]
Software and Computer Systems
School of Information and Communication Technology
KTH – Royal Institute of Technology
Stockholm, Sweden
ID1218 Lecture 07
2009-11-18
Overview
2
C++ Basics
Basic types and control structures
Functions and Arrays
Pointers
Some pragmatics…
ID1218, Christian Schulte
L07, 2009-11-18
Goals
3
Familiarize with programming in C/C++
Understand underlying programming model
Understand
language constructs
program structure
data structures and common algorithms
memory management
development pragmatics
difference between C and C++
For later courses using C/C++
ID1218, Christian Schulte
L07, 2009-11-18
Approach
4
Not from scratch, build
Java
as programming language
Efficient approach
focus
on essential
not comprehensive
apply practically
ID1218, Christian Schulte
L07, 2009-11-18
Textbook
5
C++ for Java Programmers,
Mark Allen Weiss, Prentice Hall, 2004
good
selection of issues and topic
non-naïve: no repetition what you know
concise (very important)
valuable resource after course!!!
ID1218, Christian Schulte
L07, 2009-11-18
Other Valuable Books: C++
6
Thick, verbose, but useful
J. Lajoie and S. Lippmann, C++ Primer
3rd edition, Addison-Wesley, 1998.
Reference from the designer
B. Stroustrup, The C++ Programming Language
3rd edition, Addison-Wesley, 1997.
Tips for advanced issues
R. B. Murray, C++ Strategies and Tactics
Addison-Wesley, 1993.
C++ Standard library
N. M. Josuttis, The C++ Standard Library
Addison-Wesley, 1999.
ID1218, Christian Schulte
L07, 2009-11-18
Other Valuable Books: C
7
The classic
B. W. Kernighan and D. M. Ritchie, The C Programming
Language
2nd edition, Prentice Hall, 1997
Great reference, portability, also useful for C++
S. P. Harbinson, G. L. Steele, C – A Reference Manual
5th edition, Prentice Hall, 2002
ID1218, Christian Schulte
L07, 2009-11-18
What?
8
C++ as main vehicle
basic
issues
pointers and references
classes, objects, inheritance
overview: operator overloading, templates, exceptions,
input/output, standard library
Contrast with main differences in C
basic
issues (arrays)
memory management, input/output
mixing C and C++
ID1218, Christian Schulte
L07, 2009-11-18
Why?
9
Study radically different model of computation
not
type safe: how to get along
explicit memory management: no garbage collection, how to
manage memory successfully
close to abstraction level of machines
Ideally, do it in Erlang…
…but can't be done
take
the trouble and use C++/C
can be used afterwards anyway
ID1218, Christian Schulte
L07, 2009-11-18
How?
10
Differential approach
in
contrast to Java: Java is close in many aspects
Practical approach
try
most important aspects in labs/tutorials
ID1218, Christian Schulte
L07, 2009-11-18
What Do I Expect?
11
You will not become C++ wizards
You will understand the basic issues
characteristics
of computation model
characteristics of development pragmatics
You will know where to look for further information
language
pragmatics
ID1218, Christian Schulte
L07, 2009-11-18
Pragmatics
12
How to organize programming projects
automatize
make
How to install software
use
recompilation
configure
How to develop
how
to find errors: debugging
how to improve performance: profiling
ID1218, Christian Schulte
L07, 2009-11-18
Labs
13
Labs
warm-up:
sound
processing:
Sudoku solver:
Hand in: show to TA
introduction to pragmatics
to be handed in
to be handed in
ID1218, Christian Schulte
L07, 2009-11-18
Reading Suggestions
14
All of you
thorough
reading of chapters 0 to 3
take a peek at chapter 11
do it, the book is a great read!
go through the exercises!
ID1218, Christian Schulte
L07, 2009-11-18
15
Getting Started in C++
ID1218, Christian Schulte
L07, 2009-11-18
Our First C++ Program
16
#include <iostream>
using namespace std;
int main() {
cout << "Hello world." << endl;
return 0;
}
ID1218, Christian Schulte
L07, 2009-11-18
Hello World Explained
17
Execution starts with main
integer
return value is error code (0 is okay)
is normal function (a global function)
can
functions in classes (methods): member functions
take additional arguments (command-line): later
All C++ programs are preprocessed
<…> resolved by preprocessor
<iostream> refers to C++ system IO
#include "my.h" includes local file my.h
Other uses: multiply used files (declarations, headers)
#include
ID1218, Christian Schulte
L07, 2009-11-18
Hello World Explained…
18
Standard functionality in namespace std
becomes
available by using namespace std;
here: cout (standard output), endl (end of line)
Input similarly:
int x;
cout << "Your age: ";
cin >> x;
refers to standard input
also common: using C-style input/output
cin
ID1218, Christian Schulte
L07, 2009-11-18
In Java…
19
public class Hello {
public static void main(String[]) {
System.out.println("Hello world");
}
}
ID1218, Christian Schulte
L07, 2009-11-18
Compiling and Running
20
Edit file
emacs hello.cpp
other
Invoke compiler to create executable
g++ hello.cpp –o hello.exe
we
extensions: .cc, .cxx, .C
use the GNU C++ compiler (g++)
Run executable
./hello.exe
ID1218, Christian Schulte
L07, 2009-11-18
21
Basic Types and Control Structures
ID1218, Christian Schulte
L07, 2009-11-18
Primitive Types
22
Integer types
Floating point types
Character types
Boolean type
Non-primitive types
arrays,
objects, pointers, references, …
ID1218, Christian Schulte
L07, 2009-11-18
Integer Types
23
Basic integer type int
few guarantees on range in C++
today, often 32 bits, anytime soon 64 bits, …
depends on machine (think of embedded…)
Can be augmented with short or long
int
int
never shorter than
never longer than
short int (at least 16)
long int (at least 32)
Can be modified with signed (default) or unsigned
short signed int
short unsigned int
just for example!
-32768 … 32767
0 … 65535
ID1218, Christian Schulte
L07, 2009-11-18
Floating Point Types
24
Single precision
often:
32 bits
Double precision
often:
float
double
64 bits
Again, few guarantees
ID1218, Christian Schulte
L07, 2009-11-18
Character Type
25
Character type char
no
guarantee on size, often 8 bits (ASCII, not Unicode!)
unspecified whether signed or unsigned
Character constants in single quotes
'a',
'1'
escape sequences: '\n' for newline, etc
Also available: wchar_t for wide characters
ID1218, Christian Schulte
L07, 2009-11-18
Boolean Type
26
Boolean type
constants
bool
true and false
Rather late addition!
watch
out for int with zero as false and any other value
true!
ID1218, Christian Schulte
L07, 2009-11-18
Constants
27
Variables taking an immutable value
cannot
be changed
abbreviation for commonly used values
Use const modifier
const double pi = 3.1415;
assignment
to pi not possible
ID1218, Christian Schulte
L07, 2009-11-18
Operators, Expressions, Statements
28
Almost the same in C++ as in Java
in general: C++ carries some historic weight, Java has cleaned up,
so watch out for some gotchas
Almost the same
operators and expressions, conditionals, loops, …
assignment: no guarantee of initialization
Additionally
casts: change/convert/ignore type
type definitions
ID1218, Christian Schulte
L07, 2009-11-18
Operators and Expressions
29
No left to right order
readInt() – readInt()
with input 2 and 3 can be either 1 or -1
Integer division not guaranteed to round towards
zero (book uses down)
8/-5
can be either -1 or -2
Comma operator: a,b evaluates to b
weird
things possible!
ID1218, Christian Schulte
L07, 2009-11-18
Operators and Expressions
30
No guarantee on shift a << b
can
be either arithmetic or logic
arithmetic
-1 << 1 remains negative
logic
-1 << 1 is positive
ID1218, Christian Schulte
L07, 2009-11-18
Conditionals
31
Condition can be either of type int or bool
if (i) { … } else { … }
If
i is different from zero, take then part
If i is zero, take else part
not recommended, write
if (i != 0) …
Common mistake
if (x = 0) …
actually
meant: if (x == 0) …
assigns 0 to x, takes the else part
write variable to the right, if possible: if (0 == x)
ID1218, Christian Schulte
L07, 2009-11-18
Loops
32
As in Java, along with break and continue
ID1218, Christian Schulte
L07, 2009-11-18
Unitialized Variables
33
Variables not by guarantee initialized
unless
global or static (later)
Always give initial value
important
for objects (later)
ID1218, Christian Schulte
L07, 2009-11-18
Typecasts for Primitive Types
34
Automatic conversion
double x = 6.0; int y; y=x;
Typecasting can be essential
int x=6; int y=10;
double z = x/y;
results
in 0.0 rather than 0.6
ID1218, Christian Schulte
L07, 2009-11-18
Static Casts
35
Cast at least one into double
static_cast<double>(x)/y;
Other casts
casting objects, later
const_cast
later
reinterpret_cast just do it as size fits…
C-style cast
((double) x)
dynamic_cast
dangerous, combines everything, don't use!
ID1218, Christian Schulte
L07, 2009-11-18
Type Definitions
36
Give names to types
Example: define implementation dependent integer
type uint32
machine
A:
typedef unsigned long int uint32;
machine B:
typedef unsigned int uint32;
rest of program can use uint32, does not require
modification when being ported to machine C
ID1218, Christian Schulte
L07, 2009-11-18
37
Functions
ID1218, Christian Schulte
L07, 2009-11-18
Function Definition
38
Function definition contains
return
type
function name
parameter list
body
Function can be called given function name and
appropriate parameters
Function can only be defined once
ID1218, Christian Schulte
L07, 2009-11-18
Function Example
39
int maxx(int x, int y) {
return (x > y) ? x : y;
}
ID1218, Christian Schulte
L07, 2009-11-18
Function Invocation
40
Print maximum of two numbers
cout << maxx(43,27) << endl;
Uses call-by-value
Parameters need not be of type int
automatic
cast long int
possibly with warning
ID1218, Christian Schulte
L07, 2009-11-18
Function Overloading
41
The same function name can be used multiply with
different types in parameter list
double maxx(double x, double y) {
return (x>y) ? x : y;
}
Complicated set of rules describe which definition is
chosen
Overloading with different return type only not allowed
ID1218, Christian Schulte
L07, 2009-11-18
Function Declarations
42
Every function needs to be declared prior to
invocation
declared,
but not defined!
can be declared multiply
A function declaration is done by giving a function
prototype
int maxx(int, int);
or
int maxx(int a, int b);
ID1218, Christian Schulte
L07, 2009-11-18
Default Parameters
43
Default values can be given for formal parameters
if function has declaration, in declaration
if function has only definition, in definition
only allowed as last formal parameters
Assume that maxx is often used with 0 as second
argument
int maxx(int, int = 0);
Then the following invocation is legal
int z = maxx(-45);
In this case, definition remains unchanged
ID1218, Christian Schulte
L07, 2009-11-18
Inline Functions
44
Overhead of function call be significant: maxx is good
example
Give function definition an inline directive
inline int maxx(int x, int y) {
…
}
Invocation of function is replaced by body
Definition must be textually before first invocation
Compilers will also inline other, small functions
ID1218, Christian Schulte
L07, 2009-11-18
Separate Compilation
45
Structure larger programs into separate files
each
file contains some functions: better structure
each file can be compiled independently: save compilation
time during development
Header file
contains
declarations and definitions of inline functions
file name extensions: .h, .hh
Implementation file
contains
definition of functions (implementation)
ID1218, Christian Schulte
L07, 2009-11-18
Header File maxx.h
46
/*
* Declaration of maximum function
*/
int maxx(int, int);
ID1218, Christian Schulte
L07, 2009-11-18
Implementation File maxx.cpp
47
#include "maxx.h"
int maxx(int x, int y) {
return (x > y) ? x : y;
}
ID1218, Christian Schulte
L07, 2009-11-18
Main File main.cpp
48
#include <iostream>
#include "maxx.h"
int main() {
std::cout << maxx(47,23)
<< std::endl;
return 0;
}
ID1218, Christian Schulte
L07, 2009-11-18
Putting Everything Together
49
Compile each implementation file independently
g++ -c main.cpp
g++ -c maxx.cpp
creates
the files main.o and maxx.o
contain object code but require linking
Put everything together (linking)
g++ main.o maxx.o –o main.exe
ID1218, Christian Schulte
L07, 2009-11-18
Include Each Header at Most Once
50
Remember: inline functions must be defined not only
declared before usage
Remember: at most one definition!
what if header is included from other header files
possibly having multiple definitions of same function
also: why read same header more than once?
Use preprocessor (also macro processor) to guarantee atmost-once inclusion
define a preprocessor variable when included
test whether preprocessor variable not already defined
choose reasonably unique name
ID1218, Christian Schulte
L07, 2009-11-18
Fixed Header File maxx.h
51
/*
* Declaration of maximum function
*/
#ifndef __MAXX_H__
#define __MAXX_H__
int maxx(int, int);
#endif
ID1218, Christian Schulte
L07, 2009-11-18
Organizing Compilation
52
How to organize compilation
recompilation needed if included header file changes
compilation can be time-consuming: > 1000 files?
only recompile what is needed
Use make: express dependencies among files
files only recompiled, if dependencies change
rules for how to perform compilation
.cpp .o
.o .exe
later (first lab session) more
ID1218, Christian Schulte
L07, 2009-11-18
53
Arrays
ID1218, Christian Schulte
L07, 2009-11-18
C-style Arrays
54
C-style arrays
int a[42];
creates an array of 42 integers
access
cout << a[1];
assignment
a[1] = a[2]+a[3];
ranges from a[0] to a[41]
Dimension of array must be constant
can
be evaluated at compile time to constant (eg 2*4)
illegal int a[n] where n is variable!
ID1218, Christian Schulte
L07, 2009-11-18
Using Arrays as Parameters
55
int find_max(int a[], int n) {
int m = a[0];
for (int i = 1; i<n; i++)
if (a[i] > m) m=a[i];
return m;
}
Array of arbitrary size int a[]
requires
to pass size as extra parameter int n
ID1218, Christian Schulte
L07, 2009-11-18
Using Arrays as Parameters
56
int find_max(int a[42]) {
int m = a[0];
for (int i = 1; i<42; i++)
if (a[i] > m) m=a[i];
return m;
}
Supports only arrays statically known to have size
42!
ID1218, Christian Schulte
L07, 2009-11-18
Allocating Arrays
57
What if size is not known statically
memory
for array must be allocated from heap
after use, memory must be explicitly freed
C++ style memory management
use
new [] and delete []
special versions for arrays
normal versions to be used later for objects
ID1218, Christian Schulte
L07, 2009-11-18
Allocating Arrays
58
Allocate an array of integers with size n
new int[n];
Free memory array (no matter its size or type)
delete [] a;
The following does not work
int a[] = new int[n];
a
must have know size, or used as parameter
use pointers rather than arrays (a little later)
ID1218, Christian Schulte
L07, 2009-11-18
Primitive Arrays of Constants
59
Initialize arrays in declaration
declare
array to be not assignable
const int DIM[] =
{31,28,31,30,31,30,
31,31,30,31,30,31};
declares
array of size 12
ID1218, Christian Schulte
L07, 2009-11-18
C-Style Strings
60
Use arrays of chars!
Often
const char s[] = "A C-string.";
contains
all letters given plus
0 at the end (end-of-string marker)
has size 12 (additional 0)
ID1218, Christian Schulte
L07, 2009-11-18
Vectors and C++ Strings
61
Vectors are C++ arrays
#include <vector>
automatic resize
automatic memory management
copied when passed as parameters
Strings
#include <string>
same advantages as above
support for comparison, copying on assignment, …
Please read book about both vectors and strings
ID1218, Christian Schulte
L07, 2009-11-18
62
Parameter Passing
ID1218, Christian Schulte
L07, 2009-11-18
Call By-value
63
Default mechanism already seen
works
by copying: straightforward for primitive types
but copying also for objects: to be discussed later!
What if one return value is not enough?
use
call by-reference
ID1218, Christian Schulte
L07, 2009-11-18
Call By-reference
64
Function to exchange to values, first attempt
(wrong):
void exc(int a, int b) {
int t=a; a=b; b=t;
}
just
works on copies passed to exc
need to pass references instead
ID1218, Christian Schulte
L07, 2009-11-18
Call By-reference
65
Function to exchange to values (correct):
void exc(int &a, int &b) {
int t=a; a=b; b=t;
}
a
and b are passed by reference
effect is on actual parameters
int x = 4; int y = 5;
exc(x,y);
constants are not allowed as actual parameters
exc(x,5);
ID1218, Christian Schulte
L07, 2009-11-18
66
Pointers: Outlook
ID1218, Christian Schulte
L07, 2009-11-18
Pointers
67
Are a consequence that memory management is not
abstracted away
Erlang
and Java: all variables hold references to values,
operations are performed implicitly on value
C and C++ distinguish
objects
(also primitive values)
pointers: values which point to memory address of objects
ID1218, Christian Schulte
L07, 2009-11-18
Pointers
68
Declaring a pointer to an integer
int* p;
Let p point to address of x
int x = 5;
p = &x;
Read value at pointer: prints 5
cout << *p;
& is called unary address-of operator
* is called unary dereference operator
Store value at memory referenced at p: prints 7
*p = 7; cout << x;
ID1218, Christian Schulte
L07, 2009-11-18
Pointers Illustrated…
69
(&x) 100
(&y) 104
(&p) 200
…
x = 10
y = 7
…
p = ????
…
After declaration
int x = 10;
int y = 7;
int* p;
p points somewhere (unitialized)
ID1218, Christian Schulte
L07, 2009-11-18
Segmentation Fault or Bus Error…
70
(&x) 100
(&y) 104
(&p) 200
…
x = 10
y = 7
…
p = ????
…
Assign object pointed to by p a value
*p = 124;
but:
not necessarily, p can also point to some other location
(overrides other variables contents…)
ID1218, Christian Schulte
L07, 2009-11-18
Redirecting…
71
(&x) 100
(&y) 104
(&p) 200
…
x = 10
y = 7
…
p = &x = 100
…
Let p point to location of x
p = &x;
ID1218, Christian Schulte
L07, 2009-11-18
Assigning…
72
(&x) 100
(&y) 104
(&p) 200
…
x = 5
y = 7
…
p = &x = 100
…
Assign object pointed to by p a value
*p = 5;
ID1218, Christian Schulte
L07, 2009-11-18
Redirecting…
73
(&x) 100
(&y) 104
(&p) 200
…
x = 5
y = 7
…
p = &y = 104
…
Let p point to location of y
p = &y;
ID1218, Christian Schulte
L07, 2009-11-18
Assigning…
74
(&x) 100
(&y) 104
(&p) 200
…
x = 5
y = 99
…
p = &y = 104
…
Assign object pointed to by p a value
*p = 99;
ID1218, Christian Schulte
L07, 2009-11-18
Common Idioms
75
Testing that pointers refer to same location
p1 == p2
Testing that objects pointed to have same value
*p1 == *p2
Use NULL for ptr not pointing anywhere
const int NULL = 0;
use
in initialization, tests, etc
ID1218, Christian Schulte
L07, 2009-11-18
Heap Memory Management
76
Get memory from heap
int* p = new int;
allocate
memory block big enough for one int
After use, release
delete p;
ID1218, Christian Schulte
L07, 2009-11-18
Getting It Wrong
77
Forget to delete
program crashes when running out of memory
Delete to early
lucky case: program crashes due to OS knowing that memory has
been freed
unlucky case: already reused, arbitrary things can happen!
Delete twice
runtime error
ID1218, Christian Schulte
L07, 2009-11-18
What Is Next?
78
Storage classes
automatic
and static variables
Arrays are pointers
int* a = new int[n];
ID1218, Christian Schulte
L07, 2009-11-18
79
Summary
ID1218, Christian Schulte
L07, 2009-11-18
Summary
80
Radically new computation model
not
type safe
explicit memory management
Few guarantees
primitive
types and their operations
Memory management is very difficult!
ID1218, Christian Schulte
L07, 2009-11-18