Copyright © 2001 Stephen A. Edwards All rights reserved The C++ Language Prof. Stephen A. Edwards.

Slides:



Advertisements
Similar presentations
Chapter 7 Constructors and Other Tools. Copyright © 2006 Pearson Addison-Wesley. All rights reserved. 7-2 Learning Objectives Constructors Definitions.
Advertisements

The C ++ Language BY Shery khan. The C++ Language Bjarne Stroupstrup, the language’s creator C++ was designed to provide Simula’s facilities for program.
Object-Oriented programming in C++ Classes as units of encapsulation Information Hiding Inheritance polymorphism and dynamic dispatching Storage management.
Exceptions, Templates, And The Standard Template Library (STL) Chapter 16.
Copyright © 2012 Pearson Education, Inc. Chapter 16: Exceptions, Templates, and the Standard Template Library (STL)
. Templates. Example… A useful routine to have is void Swap( int& a, int &b ) { int tmp = a; a = b; b = tmp; }
ISBN Chapter 11 Abstract Data Types and Encapsulation Concepts.
Chapter 3 Data Abstraction: The Walls. © 2005 Pearson Addison-Wesley. All rights reserved3-2 Abstract Data Types Modularity –Keeps the complexity of a.
Chapter 16 Templates. Copyright © 2006 Pearson Addison-Wesley. All rights reserved Learning Objectives  Function Templates  Syntax, defining 
Chapter 6. 2 Objectives You should be able to describe: Function and Parameter Declarations Returning a Single Value Pass by Reference Variable Scope.
C++ Training Datascope Lawrence D’Antonio Lecture 1 Quiz 1.
Starting Out with C++: Early Objects 5/e © 2006 Pearson Education. All Rights Reserved Starting Out with C++: Early Objects 5 th Edition Chapter 16 Exceptions,
Guide To UNIX Using Linux Third Edition
Object-Oriented programming in C++ Classes as units of encapsulation Information Hiding Inheritance polymorphism and dynamic dispatching Storage management.
Abstract Data Types and Encapsulation Concepts
 2007 Pearson Education, Inc. All rights reserved C++ as a Better C; Introducing Object Technology.
Templates. Example… A useful routine to have is void swap(int &a, int &b){ int tmp = a; a = b; b = tmp; }
CSE 332: C++ Classes From Procedural to Object-oriented Programming Procedural programming –Functions have been the main focus so far Function parameters.
CSE 332: C++ templates and generic programming I Motivation for Generic Programming in C++ We’ve looked at procedural programming –Reuse of code by packaging.
Introduction to C++ Systems Programming.
OOP Languages: Java vs C++
Object Oriented Programming using C++. Overview Problem Solving Features of an OOL Basic Syntax Programming Paradigms.
CSIS 123A Lecture 12 Templates. Introduction  C++ templates  Allow very ‘general’ definitions for functions and classes  Type names are ‘parameters’
1 CISC181 Introduction to Computer Science Dr. McCoy Lecture 19 Clicker Questions November 3, 2009.
C++ Programming: Program Design Including Data Structures, Fourth Edition Chapter 13: Pointers, Classes, Virtual Functions, and Abstract Classes.
C++ Object Oriented 1. Class and Object The main purpose of C++ programming is to add object orientation to the C programming language and classes are.
Pointer Data Type and Pointer Variables
C++ Programming: From Problem Analysis to Program Design, Fourth Edition Chapter 14: Pointers, Classes, Virtual Functions, and Abstract Classes.
Nirmalya Roy School of Electrical Engineering and Computer Science Washington State University Cpt S 122 – Data Structures Custom Templatized Data Structures.
1 Chapter 10: Data Abstraction and Object Orientation Aaron Bloomfield CS 415 Fall 2005.
Algorithm Programming Bar-Ilan University תשס"ח by Moshe Fresko.
Programming Language C++ Xulong Peng CSC415 Programming Languages.
CS212: Object Oriented Analysis and Design Lecture 6: Friends, Constructor and destructors.
Object Oriented Programming with C++/ Session 6 / 1 of 44 Multiple Inheritance and Polymorphism Session 6.
Hello.java Program Output 1 public class Hello { 2 public static void main( String [] args ) 3 { 4 System.out.println( “Hello!" ); 5 } // end method main.
Copyright 2003 Scott/Jones Publishing Standard Version of Starting Out with C++, 4th Edition Chapter 13 Introduction to Classes.
Learners Support Publications Classes and Objects.
Programming Languages by Ravi Sethi Chapter 6: Groupings of Data and Operations.
Copyright © Curt Hill Generic Classes Template Classes or Container Classes.
C++ Memory Overview 4 major memory segments Key differences from Java
Chapter 12: Pointers, Classes, Virtual Functions, and Abstract Classes.
CPSC 252 Operator Overloading and Convert Constructors Page 1 Operator overloading We would like to assign an element to a vector or retrieve an element.
C++ How to Program, 9/e © by Pearson Education, Inc. All Rights Reserved.
Lecture 3 Classes, Structs, Enums Passing by reference and value Arrays.
Standard Template Library The Standard Template Library was recently added to standard C++. –The STL contains generic template classes. –The STL permits.
Introduction to c++ programming - object oriented programming concepts - Structured Vs OOP. Classes and objects - class definition - Objects - class scope.
Lecture 19 CIS 208 Wednesday, April 06, Welcome to C++ Basic program style and I/O Class Creation Templates.
CMPSC 16 Problem Solving with Computers I Spring 2014 Instructor: Lucas Bang Lecture 16: Introduction to C++
Object-Oriented Programming Chapter Chapter
Copyright © 2005 Elsevier Object-Oriented Programming Control or PROCESS abstraction is a very old idea (subroutines!), though few languages provide it.
 2008 Pearson Education, Inc. All rights reserved. 1 Arrays and Vectors.
Computing and Statistical Data Analysis Lecture 6 Glen Cowan RHUL Physics Computing and Statistical Data Analysis Introduction to classes and objects:
1 Becoming More Effective with C++ … Day Two Stanley B. Lippman
1 Classes II Chapter 7 2 Introduction Continued study of –classes –data abstraction Prepare for operator overloading in next chapter Work with strings.
STL CSSE 250 Susan Reeder. What is the STL? Standard Template Library Standard C++ Library is an extensible framework which contains components for Language.
CSCI-383 Object-Oriented Programming & Design Lecture 25.
Chapter 7 Constructors and Other Tools Copyright © 2010 Pearson Addison-Wesley. All rights reserved.
Object-Oriented programming in C++ Classes as units of encapsulation Information Hiding Inheritance polymorphism and dynamic dispatching Storage management.
Chapter 16 Templates Copyright © 2008 Pearson Addison-Wesley. All rights reserved.
Chapter 12: Pointers, Classes, Virtual Functions, Abstract Classes, and Lists.
Templates 3 Templates and type parameters The basic idea templates is simple: we can make code depend on parameters, so that it can be used in different.
CSE 332: C++ Exceptions Motivation for C++ Exceptions Void Number:: operator/= (const double denom) { if (denom == 0.0) { // what to do here? } m_value.
Copyright © 2002 Pearson Education, Inc. Slide 1.
Copyright © 2002 Pearson Education, Inc. Slide 1.
Examples (D. Schmidt et al)
CS 215 Final Review Ismail abumuhfouz Fall 2014.
The C++ Language.
Chapter 5 Classes.
Constructors and Other Tools
Presentation transcript:

Copyright © 2001 Stephen A. Edwards All rights reserved The C++ Language Prof. Stephen A. Edwards

Copyright © 2001 Stephen A. Edwards All rights reserved The C++ Language  Bjarne Stroupstrup, the language’s creator C++ was designed to provide Simula’s facilities for program organization together with C’s efficiency and flexibility for systems programming.

Copyright © 2001 Stephen A. Edwards All rights reserved C++ Features  Classes User-defined types  Operator overloading Attach different meaning to expressions such as a + b  References Pass-by-reference function arguments  Virtual Functions Dispatched depending on type at run time  Templates Macro-like polymorphism for containers (e.g., arrays)  Exceptions

Copyright © 2001 Stephen A. Edwards All rights reserved Example: A stack in C typedef struct { char s[SIZE]; int sp; } Stack; stack *create() { Stack *s; s = (Stack *)malloc(sizeof(Stack)); s->sp = 0; return s; } Creator function ensures stack is created properly. Does not help for stack that is automatic variable. Programmer could inadvertently create uninitialized stack.

Copyright © 2001 Stephen A. Edwards All rights reserved Example: A stack in C char pop(Stack *s) { if (sp = 0) error(“Underflow”); return s->s[--sp]; } void push(Stack *s, char v) { if (sp == SIZE) error(“Overflow”); s->s[sp++] = v; } Not clear these are the only stack- related functions. Another part of program can modify any stack any way it wants to, destroying invariants. Temptation to inline these computations, not use functions.

Copyright © 2001 Stephen A. Edwards All rights reserved C++ Solution: Class class Stack { char s[SIZE]; int sp; public: Stack() { sp = 0; } void push(char v) { if (sp == SIZE) error(“overflow”); s[sp++] = v; } char pop() { if (sp == 0) error(“underflow”); return s[--sp]; } }; Definition of both representation and operations Constructor: initializes Public: visible outside the class Member functions see object fields like local variables

Copyright © 2001 Stephen A. Edwards All rights reserved C++ Stack Class  Natural to use Stack st; st.push(‘a’); st.push(‘b’); char d = st.pop(); Stack *stk = new Stack; stk->push(‘a’); stk->push(‘b’); char d = stk->pop();

Copyright © 2001 Stephen A. Edwards All rights reserved C++ Stack Class  Members (functions, data) can be public, protected, or private class Stack { char s[SIZE]; public: char pop(); }; Stack st; st.s[0] = ‘a’; // Error: sp is private st.pop(); // OK

Copyright © 2001 Stephen A. Edwards All rights reserved Class Implementation  C++ compiler translates to C-style implementation C++ class Stack { char s[SIZE]; int sp; public: Stack() void push(char); char pop(); }; Equivalent C implementation struct Stack { char s[SIZE]; int sp; }; void st_Stack(Stack*); void st_push(Stack*, char); char st_pop(Stack*);

Copyright © 2001 Stephen A. Edwards All rights reserved Operator Overloading  For manipulating user-defined “numeric” types Complex c1(1,5.3), c2(5); Complex c3 = c1 + c2; c3 = c ; Creating objects of the user-defined type Want + to mean something different in this context Promote 2.3 to a complex number here

Copyright © 2001 Stephen A. Edwards All rights reserved Example: Complex number type  C++’s operator overloading makes it elegant Class Complex { double re, im; public: complex(double); complex(double, double); complex& operator+=(const complex&); }; Pass-by-reference reduces copying Operator overloading defines arithmetic operators for the complex type

Copyright © 2001 Stephen A. Edwards All rights reserved References  Designed to avoid copying in overloaded operators  A mechanism for calling functions pass-by-reference  C only has pass-by-value void swap(int x, int y) { /* Doesn’t work */ int tmp = x; x = y; y = tmp; } void swap(int &x, int &y) { /* Works with references */ int tmp = x; x = y; y = tmp; }

Copyright © 2001 Stephen A. Edwards All rights reserved Complex Number Type  Member functions including operators can be defined inside or outside the class definition Complex& Complex::operator+=(const complex &a) { re += a.re; im += a.im; return *this; }

Copyright © 2001 Stephen A. Edwards All rights reserved Complex Number Class  Operators can also be defined outside classes Complex operator+(const Complex a, const Complex b) { Complex sum = a; // Copy constructor a += b; // invoke Complex::operator += return sum; }

Copyright © 2001 Stephen A. Edwards All rights reserved Function Overloading  Overloaded operators a specific case of overloading  General: select specific method/operator based on name, number, and type of arguments void foo(int); void foo(int, int);// OK void foo(char *);// OK int foo(char *);// BAD: return type not in signature

Copyright © 2001 Stephen A. Edwards All rights reserved Const  Access control over variables, arguments.  Provides safety const double pi = ;// Compile-time constant int foo(const char* a) {// Constant argument *a = ‘a’; // Illegal: a is const } class bar {// “object not modified” int get_field() const { return field; } } Rock of Gibraltar

Copyright © 2001 Stephen A. Edwards All rights reserved Templates  Our stack type is nice, but hard-wired for a single type of object  Using array of “void *” or a union might help, but breaks type safety  C++ solution: a template class  Macro-processor-like way of specializing a class to specific types  Mostly intended for container classes  Standard Template Library has templates for strings, lists, vectors, hash tables, trees, etc.

Copyright © 2001 Stephen A. Edwards All rights reserved Template Stack Class template class Stack { T s[SIZE]; int sp; public: Stack() { sp = 0; } void push(T v) { if (sp == SIZE) error(“overflow”); s[sp++] = v; } T pop() { if (sp == 0) error(“underflow”); return s[--sp]; } }; T is a type argument Used like a type within the body

Copyright © 2001 Stephen A. Edwards All rights reserved Using a template Stack cs;// Instantiates the specialized code cs.push(‘a’); char c = cs.pop(); Stack dps; double d; dps.push(&d);

Copyright © 2001 Stephen A. Edwards All rights reserved Display-list example  Say you want to draw a graphical scene  List of objects lines, arcs, circles, squares, etc.  How do you store them all in a single array? void *list[10];// Ugly: type-unsafe  How do you draw them all? switch (object->type) {// Hard to add new object case LINE: /* … */ break; case ARC: /* … */ break; }

Copyright © 2001 Stephen A. Edwards All rights reserved Inheritance  Inheritance lets you build derived classes from base classes class Shape { /* … */ }; class Line : public Shape { /* … */ };// Also a Shape class Arc : public Shape { /* … */ };// Also a Shape Shape *dlist[10];

Copyright © 2001 Stephen A. Edwards All rights reserved Inheritance class Shape { double x, y;// Base coordinates of shape public: void translate(double dx, double dy) { x += dx; y += dy; } }; class Line : public Shape { }; Line l; l.translate(1,3);// Invoke Shape::translate() Line inherits both the representation and member functions of the Shape class

Copyright © 2001 Stephen A. Edwards All rights reserved Implementing Inheritance  Add new fields to the end of the object  Fields in base class at same offset in derived class C++ class Shape { double x, y; }; class Box : Shape { double h, w; }; Equivalent C implementation struct Shape { double x, y }; struct Box { double x, y; double h, w; };

Copyright © 2001 Stephen A. Edwards All rights reserved Virtual Functions class Shape { virtual void draw(); }; class Line : public Shape { void draw(); }; class Arc : public Shape { void draw(); }; Shape *dl[10]; dl[0] = new Line; dl[1] = new Arc; dl[0]->draw();// invoke Line::draw() dl[1]->draw();// invoke Arc::draw() draw() is a virtual function invoked based on the actual type of the object, not the type of the pointer New classes can be added without having to change “draw everything” code

Copyright © 2001 Stephen A. Edwards All rights reserved Implementing Virtual Functions  Involves some overhead class Virt { int a, b; virtual void foo(); virtual void bar(); }; a b vptr &Virt::foo &Virt::bar Object of type Virt Virtual table for class Virt C++ void f(Virt *v) { v->bar(); } Equivalent C implementation void f(Virt *v) { (*(v->vptr.bar))(v); }

Copyright © 2001 Stephen A. Edwards All rights reserved Cfront  How the language was first compiled  Full compiler that produced C as output  C++ semantics therefore expressible in C  C++ model of computation ultimately the same  C++ syntax substantial extension of C  C++ semantics refer to the same model as C  So why use C++? Specifications are clearer, easier to write and maintain

Copyright © 2001 Stephen A. Edwards All rights reserved Default arguments  Another way to simplify function calls  Especially useful for constructors void foo(int a, int b = 3, int c = 4) { /* … */ } C++Expands to foo(3)foo(3,3,4) foo(4,5)foo(4,5,4)foo(4,5,6)

Copyright © 2001 Stephen A. Edwards All rights reserved Declarations may appear anywhere  Convenient way to avoid uninitialized variables void f(int i, const char *p) { if (i<=0) error(); const int len = strlen(p); char c = 0; for (int j = i ; j<len ; j++) c += p[j]; }

Copyright © 2001 Stephen A. Edwards All rights reserved Multiple Inheritance  Rocket Science  Inherit from two or more classes: class Window { … }; class Border { … }; class BWindow : public Window, public Border { … };

Copyright © 2001 Stephen A. Edwards All rights reserved Multiple Inheritance Ambiguities  What happens with duplicate methods? class Window { void draw(); }; class Border { void draw() }; class BWindow : public Window, public Border { }; BWindow bw; bw.draw();// Error: ambiguous

Copyright © 2001 Stephen A. Edwards All rights reserved Multiple Inheritance Ambiguities  Ambiguity can be resolved explicitly class Window { void draw(); }; class Border { void draw() }; class BWindow : public Window, public Border { void draw() { Window::draw(); } }; BWindow bw; bw.draw();// BWindow::draw() calls Window::draw()

Copyright © 2001 Stephen A. Edwards All rights reserved Duplicate Base Classes  A class may be inherited more than once class Drawable { … }; class Window : public Drawable { … }; class Border : public Drawable { … }; class BWindow : public Window, public Border { … };  BWindow gets two copies of the Drawable base class

Copyright © 2001 Stephen A. Edwards All rights reserved Duplicate Base Classes  Virtual base classes are inherited at most once class Drawable { … }; class Window : public virtual Drawable { … }; class Border : public virtual Drawable { … }; class BWindow : public Window, public Border { … };  BWindow gets one copy of the Drawable base class

Copyright © 2001 Stephen A. Edwards All rights reserved Implementing Multiple Inheritance  A virtual function expects a pointer to its object struct A { virtual void f(); } struct B { virtual void f(); } struct C : A, B { void f(); }  E.g., C::f() expects “this” to be a C*  But this could be called with “this” being a B* B A C B *b C *c or A *a In-memory representation of a C

Copyright © 2001 Stephen A. Edwards All rights reserved Implementation Using VT Offsets struct A { int x; virtual void f(); } struct B { int y; virtual void f(); virtual void g(); } struct C : A, B { int z; void f(); } C c; B *b = &c; b->f(); // C::f() 1.b is a B*: vptr has f(), g() 2.Call C::f( this – 2 ) 3.First argument now points to a C x y vptr &C::f0 &C::f–2 c C’s vtbl vptr z &B::g0 B in C’s vtbl b

Copyright © 2001 Stephen A. Edwards All rights reserved Implementation Using Thunks  Create little “helper functions” that adjust this  Advantage: Only pay extra cost for virtual functions with multiple inheritance x y vptr &C::f &C::f_in_B c C’s vtbl vptr z &B::g B in C’s vtbl b void C::f_in_B(void* this) { return C::f(this – 2); }

Copyright © 2001 Stephen A. Edwards All rights reserved Namespaces  Namespace pollution Occurs when building large systems from pieces Identical globally-visible names clash How many programs have a “print” function? Very difficult to fix  Classes suggest a solution class A { void f(); }; class B { void f(); };  Two f’s are separate

Copyright © 2001 Stephen A. Edwards All rights reserved Namespaces  Scope for enclosing otherwise global declarations namespace Mine { void print(int); const float pi = ; class Shape { }; } void bar(float y) { float x = y + Mine::pi; Mine::print(5); }

Copyright © 2001 Stephen A. Edwards All rights reserved Namespaces  using directive brings namespaces or objects into scope namespace Mine { const float pi = ; void print(int); } using Mine::print; void foo() { print(5); } // invoke Mine::print using namespace Mine; float twopi = 2*pi; // Mine::pi

Copyright © 2001 Stephen A. Edwards All rights reserved Namespaces  Namespaces are open: declarations can be added namespace Mine { void f(int); } namespace Mine { void g(int); // Add Mine::g() to Mine }

Copyright © 2001 Stephen A. Edwards All rights reserved Namespaces  Declarations and definitions can be separated namespace Mine { void f(int); } void Mine::f(int a) { /* … */ }

Copyright © 2001 Stephen A. Edwards All rights reserved Exceptions  A high-level replacement for C’s setjmp/longjmp struct Except {}; void bar() { throw Except; } void foo() { try { bar(); catch (Except e) { printf(“oops”); }

Copyright © 2001 Stephen A. Edwards All rights reserved Standard Template Library  I/O Facilities: iostream  Garbage-collected String class  Containers vector, list, queue, stack, map, set  Numerical complex, valarray  General algorithms search, sort

Copyright © 2001 Stephen A. Edwards All rights reserved C++ IO Facilities  C’s printing facility is clever but unsafe char *s; int d; double g; printf(“%s %d %g”, s, d, g);  Hard for compiler to typecheck argument types against format string  C++ IO overloads the > operators cout << s << ‘ ‘ << d << ‘ ‘ << g;  Type safe

Copyright © 2001 Stephen A. Edwards All rights reserved C++ IO Facilities  Printing user-defined types ostream &operator<<(ostream &o, MyType &m) { o << “An Object of MyType”; return o; }  Input overloads the >> operator int read_integer; cin >> read_integer;

Copyright © 2001 Stephen A. Edwards All rights reserved C++ string class  Reference-counted for automatic garbage collection string s1, s2; s1 = “Hello”; s2 = “There”; s1 += “ goodbye”; s1 = “”; // Frees memory occupied by “Hello goodbye”

Copyright © 2001 Stephen A. Edwards All rights reserved C++ STL Containers  Vector Dynamically growing, shrinking array of elements vector v; v.push_back(3);// vector can behave as a stack v.push_back(2); int j = v[0];// operator[] defined for vector

Copyright © 2001 Stephen A. Edwards All rights reserved Iterators  Mechanism for stepping through containers vector v; for ( vector ::iterator i = v.begin(); i != v.end() ; i++ ) { int entry = *i; } … v.begin()v.end()

Copyright © 2001 Stephen A. Edwards All rights reserved Other Containers Insert/Delete from frontmid.endrandom access vectorO(n)O(n)O(1)O(1) listO(1)O(1)O(1)O(n) dequeO(1)O(n)O(1)O(n)

Copyright © 2001 Stephen A. Edwards All rights reserved Associative Containers  Keys must be totally ordered  Implemented with trees  set Set of objects set > s; s.insert(5); set >::iterator i = s.find(3);  map Associative Array map m; m[3] = “example”;

Copyright © 2001 Stephen A. Edwards All rights reserved C++ in Embedded Systems  Dangers of using C++ No or bad compiler for your particular processor Increased code size Slower program execution  Much harder language to compile Unoptimized C++ code often much larger, slower than equivalent C

Copyright © 2001 Stephen A. Edwards All rights reserved C++ Features With No Impact  Classes Fancy way to describe functions and structs Equivalent to writing object-oriented C code  Single inheritance More compact way to write larger structures  Function name overloading Completely resolved at compile time  Namespaces Completely resolved at compile time

Copyright © 2001 Stephen A. Edwards All rights reserved Inexpensive C++ Features  Default arguments Compiler adds code at call site to set default arguments Long argument lists costly in C and C++ anyway  Constructors and destructors Function call overhead when an object comes into scope (normal case) Extra code inserted when object comes into scope (inlined case)

Copyright © 2001 Stephen A. Edwards All rights reserved Medium-cost Features  Virtual functions Extra level of indirection for each virtual function call Each object contains an extra pointer  References Often implemented with pointers Extra level of indirection in accessing data Can disappear with inline functions  Inline functions Can greatly increase code size for large functions Usually speeds execution

Copyright © 2001 Stephen A. Edwards All rights reserved High-cost Features  Multiple inheritance Makes objects much larger (multiple virtual pointers) Virtual tables larger, more complicated Calling virtual functions even slower  Templates Compiler generates separate code for each copy Can greatly increase code sizes No performance penalty

Copyright © 2001 Stephen A. Edwards All rights reserved High-cost Features  Exceptions Typical implementation: When exception is thrown, look up stack until handler is found and destroy automatic objects on the way Mere presence of exceptions does not slow program Often requires extra tables or code to direct clean-up Throwing and exception often very slow

Copyright © 2001 Stephen A. Edwards All rights reserved High-cost Features  Much of the standard template library Uses templates: often generates lots of code Very dynamic data structures have high memory- management overhead Easy to inadvertently copy large datastructures

Copyright © 2001 Stephen A. Edwards All rights reserved Bottom-line  C still generates better code  Easy to generate larger C++ executables  Harder to generate slower C++ executables  Exceptions most worrisome feature Consumes space without you asking GCC compiler has a flag to enable/disable exception support –fexceptions and –fno-exceptions