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.

Slides:



Advertisements
Similar presentations
Final and Abstract Classes
Advertisements

Chapter 7 Constructors and Other Tools. Copyright © 2006 Pearson Addison-Wesley. All rights reserved. 7-2 Learning Objectives Constructors Definitions.
Engineering Problem Solving With C++ An Object Based Approach Additional Topics Chapter 10 Programming with Classes.
Constructors and Destructors. Constructor Constructor—what’s this? Constructor—what’s this? method used for initializing objects (of certain class) method.
Object-Oriented programming in C++ Classes as units of encapsulation Information Hiding Inheritance polymorphism and dynamic dispatching Storage management.
C++ Programming Languages
Kernighan/Ritchie: Kelley/Pohl:
Polymorphism From now on we will use g++!. Example (revisited) Goal: Graphics package Handle drawing of different shapes Maintain list of shapes.
Chapter 14: Overloading and Templates
Operator Overloading: indexing Useful to create range-checked structures: class four_vect { double stor[4]; // private member, actual contents of vector.
Templates. Class templates – why? Writing programs we often use abstract data types such as stack, queue or tree. Implementations of these types may be.
Operator Overloading: bounds-checked indexing Useful to create range-checked structures: class four_vect { double stor[4]; // private member, actual contents.
Object-Oriented programming in C++ Classes as units of encapsulation Information Hiding Inheritance polymorphism and dynamic dispatching Storage management.
Copyright © 2001 Stephen A. Edwards All rights reserved The C++ Language Prof. Stephen A. Edwards.
Review of C++ Programming Part II Sheng-Fang Huang.
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.
CS 1031 C++: Object-Oriented Programming Classes and Objects Template classes Operator Overloading Inheritance Polymorphism.
C++ Programming: Program Design Including Data Structures, Fourth Edition Chapter 13: Pointers, Classes, Virtual Functions, and Abstract Classes.
LECTURE LECTURE 17 More on Templates 20 An abstract recipe for producing concrete code.
C++ Programming: From Problem Analysis to Program Design, Fourth Edition Chapter 14: Pointers, Classes, Virtual Functions, and Abstract Classes.
“is a”  Define a new class DerivedClass which extends BaseClass class BaseClass { // class contents } class DerivedClass : BaseClass { // class.
Overview of Previous Lesson(s) Over View  OOP  A class is a data type that you define to suit customized application requirements.  A class can be.
Chapter 8 More Object Concepts
CSE 332: C++ templates This Week C++ Templates –Another form of polymorphism (interface based) –Let you plug different types into reusable code Assigned.
Nirmalya Roy School of Electrical Engineering and Computer Science Washington State University Cpt S 122 – Data Structures Custom Templatized Data Structures.
EE4E. C++ Programming Lecture 1 From C to C++. Contents Introduction Introduction Variables Variables Pointers and references Pointers and references.
CS212: Object Oriented Analysis and Design Lecture 6: Friends, Constructor and destructors.
Programming Languages by Ravi Sethi Chapter 6: Groupings of Data and Operations.
C# F 1 CSC 298 Object Oriented Programming (Part 1)
1 Inheritance. 2 Why use inheritance?  The most important aspect of inheritance is that it expresses a relationship between the new class and the base.
ADTs and C++ Classes Classes and Members Constructors The header file and the implementation file Classes and Parameters Operator Overloading.
Chapter 12: Pointers, Classes, Virtual Functions, and Abstract Classes.
Pointers. What is pointer l Everything stored in a computer program has a memory address. This is especially true of variables. char c=‘y’; int i=2; According.
Lecture 3 Classes, Structs, Enums Passing by reference and value Arrays.
Summing Up Object Oriented Design. Four Major Components: Abstraction modeling real-life entities by essential information only Encapsulation clustering.
Operator Overloading: indexing Useful to create range-checked structures: class four_vect { double stor[4]; // private member, actual contents of vector.
Introduction to C Programming Lecture 6. Functions – Call by value – Call by reference Arrays Today's Lecture Includes.
C++ Programming: From Problem Analysis to Program Design, Third Edition Chapter 15: Overloading and Templates.
Principles of programming languages 10: Object oriented languages Isao Sasano Department of Information Science and Engineering.
Variations on Inheritance Object-Oriented Programming Spring
Object Oriented Programming. OOP  The fundamental idea behind object-oriented programming is:  The real world consists of objects. Computer programs.
Chapter 7 Constructors and Other Tools Copyright © 2010 Pearson Addison-Wesley. All rights reserved.
LECTURE LECTURE 17 Templates 19 An abstract recipe for producing concrete code.
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.
FUNCTIONS (C) KHAERONI, M.SI. OBJECTIVE After this topic, students will be able to understand basic concept of user defined function in C++ to declare.
C++ Functions A bit of review (things we’ve covered so far)
Defining Data Types in C++ Part 2: classes. Quick review of OOP Object: combination of: –data structures (describe object attributes) –functions (describe.
MAITRAYEE MUKERJI Object Oriented Programming in C++
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.
Chapter 2 Objects and Classes
Principles of programming languages 10: Object oriented languages
The C++ Language.
Review What is an object? What is a class?
Introduction to C++ Systems Programming.
Review: Two Programming Paradigms
Chapter 5 Classes.
C Basics.
Inheritance, Polymorphism and the Object Memory Model
Templates.
Chapter 12: Pointers, Classes, Virtual Functions, and Abstract Classes
Initialization List.
Constructors and Other Tools
Dr. Bhargavi Dept of CS CHRIST
COP 3330 Object-oriented Programming in C++
CPS120: Introduction to Computer Science
CS410 – Software Engineering Lecture #8: Advanced C++ III
四時讀書樂 (春) ~ 翁森 山光照檻水繞廊,舞雩歸詠春風香。 好鳥枝頭亦朋友,落花水面皆文章。 蹉跎莫遣韶光老,人生唯有讀書好。
Presentation transcript:

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 organization together with C’s efficiency and flexibility for systems programming.

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

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.

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.

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

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();

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

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*);

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

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

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; }

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; }

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; }

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

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; } }

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.

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

Using a template Stack cs;// Instantiates the specialized code cs.push(‘a’); char c = cs.pop(); Stack dps; double d; dps.push(&d);

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; }

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];

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

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; };

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

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); }

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

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)

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]; }

Multiple Inheritance Rocket Science Inherit from two or more classes: class Window { … }; class Border { … }; class BWindow : public Window, public Border { … };

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

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()

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

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

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

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

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); }

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

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); }

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

Namespaces Namespaces are open: declarations can be added namespace Mine { void f(int); } namespace Mine { void g(int);// Add Mine::g() to Mine }

Namespaces Declarations and definitions can be separated namespace Mine { void f(int); } void Mine::f(int a) { /* … */ }

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”); }

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

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

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;

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”

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

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()

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)

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”;

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

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

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)

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

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

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

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

Conclusion 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