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