C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++...

24
C++ Programming Languages Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C++-overview Department of Computer Engineering Sharif University of Technology 1

Transcript of C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++...

Page 1: C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1.

1

C++ Programming Languages

Lecturer: Omid Jafarinezhad

Fall 2013

Lecture 2C++-overview

Department of Computer Engineering

Sharif University of Technology

Page 2: C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1.

2

Outline• C++ Overview• C++ Design Goals• C++ Enhancements• Language Features Not Part of C++• Data Hiding Implementation in C• Data Abstraction Implementation in C• Data Abstraction Implementation in C++• Exception Handling Implementation in C++

Page 3: C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1.

3

C++ Overview• C++ was designed at AT&T Bell Labs – by Bjarne Stroustrup in the early 80’s – nearly 30 years ago!

• C++ is compatible extension of C that provides:– Stronger type-checking– Support for data abstraction– Support for object-oriented programming– Support for generic programming

Page 4: C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1.

4

C++ Design Goals• As with C, run-time efficiency is important– Unlike other languages (e.g., Ada, Java, C#, etc.)

complicated run-time libraries and virtual machines have not traditionally been required for C++• Note, that there is no language-specific support for

concurrency, persistence, or distribution in C++

• Compatibility with C libraries & traditional development tools

• As close to C as possible, but no closer

Page 5: C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1.

5

C++ Enhancements• C++ supports data abstraction & encapsulation

– e.g., the class mechanism & name spaces

• C++ supports object-oriented programming features– e.g., abstract classes, inheritance, & virtual methods

• C++ supports generic programming– e.g., parameterized types

• C++ supports sophisticated error handling– e.g., exception handling

• C++ supports identifying an object’s type at runtime– e.g., Run-Time Type Identification (RTTI)

Page 6: C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1.

6

Language Features Not Part of C++

• Concurrency

• Persistence

• Garbage Collection

• Distribution

Page 7: C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1.

7

Stack Exampletypedef int T;#define MAX_STACK 100 /* const int MAX_STACK = 100; */T stack[MAX_STACK];int top = 0;T item = 10;stack[top++] = item; // push...item = stack[--top]; // pop

• Obviously not very abstract...

Page 8: C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1.

8

Data Hiding Implementation in C/* File stack.h*/

/* Type of Stack element. */typedef int T;/* Stack interface. */int create (int len);int destroy (void);void push (T new_item);void pop (T *old_top);void top (T *cur_top);int is_empty (void);int is_full (void);

Page 9: C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1.

9

Data Hiding Implementation in C/* File stack.c */#include "stack.h"static int top, size; /* Hidden within this file. */static T *stack; /* Hidden within this file. */int create (int len) { top = 0; size = len; stack = malloc (size * sizeof (T)); return stack == 0 ? -1 : 0;}void destroy (void) { free ((void *) stack); }void push (T item) { stack[top++] = item;}void pop (T *item) { *item = stack[--top]; }void top (T *item) { *item = stack[top - 1]; }int is_empty (void) { return top == 0; }int is_full (void) { return top == size; }

Page 10: C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1.

10

Data Hiding Implementation in C• Use case

• Main problems:– The programmer must call create() first & destroy() last!– There is only one stack & only one type of stack

/* File main.c */#include "stack.h"void main(void) {

T i;push (10); /* Oops, forgot to call create! */push (20);pop (&i);destroy ();

}

Page 11: C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1.

11

Data Abstraction Implementation in C

/* File stack.h*/

typedef int T;typedef struct { size_t top, size; T *stack; } Stack;int Stack_create (Stack *s, size_t len);void Stack_destroy (Stack *s);void Stack_push (Stack *s, T item);void Stack_pop (Stack *, T *item);/* Must call before pop’ing */int Stack_is_empty (Stack *);/* Must call before push’ing */int Stack_is_full (Stack *);/* ... */

Page 12: C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1.

12

Data Abstraction Implementation in C/* File stack.c */#include "stack.h"int Stack_create (Stack *s, size_t len){ s->top = 0; s->size = len; s->stack = malloc (size * sizeof (T)); return s->stack == 0 ? -1 : 0;}void Stack_destroy (Stack *s) { free ((void *) s->stack); s->top = 0; s->size = 0; s->stack = 0;}void Stack_push (Stack *s, T item) { s->stack[s->top++] = item; }void Stack_pop (Stack *s, T *item) { *item = s->stack[--s->top]; }int Stack_is_empty (Stack *s) { return s->top == 0; }

Page 13: C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1.

13

Data Abstraction Implementation in C

• Use case

Main problems: No guaranteed initialization, termination, or assignment Still only one type of stack supported No generalized error handling... The C compiler does not enforce information hiding e.g.,

s1.top = s2.stack[0]; /* Violate abstraction */ s2.size = s3.top; /* Violate abstraction */

/* File main.c */#include "stack.h" void main(void) {

Stack s1, s2, s3; /* Multiple stacks! */T item;Stack_pop (&s2, &item); /* Pop from empty stack *//* Forgot to call Stack_create! */Stack_push (&s3, 10);s2 = s3; /* Disaster due to aliasing!!! *//* Destroy uninitialized stacks! */Stack_destroy (&s1); Stack_destroy (&s2);

}

Page 14: C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1.

14

Data Abstraction Implementation in C++

• We can get encapsulation and more than one stack:/* File stack.h*/typedef int T;class Stack {public:

Stack (size_t size);Stack (const Stack &s);void operator= (const Stack &);~Stack (void);void push (const T &item);void pop (T &item);bool is_empty (void);bool is_full (void);

private:size_t top, size; T *stack;

};

//2D point class. file: “Point.h”class Point { double x_coord; double y_coord; // Data-members public: Point(); // Constructors Point(double x, double y); ~Point(); // Destructor double getX(); // Accessors double getY(); void setX(double x); // Mutators void setY(double y); };

Page 15: C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1.

15

Data Abstraction Implementation in C++

/* File stack.cpp */#include "stack.h"Stack::Stack (size_t s): top(0), size(s), stack(new T[s]) {}Stack::Stack (const Stack &s)

: top (s.top), size (s.size), stack (new T[s.size]){

for (size_t i = 0; i < s.size; ++i) stack[i] = s.stack[i]; }void Stack::operator= (const Stack &s) {

if (this == &s) return;T *temp_stack = new T[s.size]; delete [] stack; stack = 0;for (size_t i = 0; i < s.size; ++i) temp_stack[i] = s.stack[i];stack = temp_stack; top = s.top; size = s.size;

}Stack::~Stack (void) { delete [] stack; }bool Stack::is_empty (void) { return top == 0; }bool Stack::is_full (void) { return top == size; }void Stack::push (const T &item) { stack[top++] = item; }void Stack::pop (T &item) { item = stack[--top]; }

Page 16: C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1.

16

Data Abstraction Implementation in C++

• Use case

/* File main.c */#include "stack.h" void main(void) {

Stack s1 (1), s2 (100);T item;if (!s1.is_full ())

s1.push (473);if (!s2.is_full ())

s2.push (2112);if (!s2.is_empty ())

s2.pop (item);// Access violation caught at compile-time!s2.top = 10;// Termination is handled automatically.

}

Page 17: C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1.

17

Benefits of C++ DAT• Data hiding & data abstraction, e.g.,

Stack s1 (200);s1.top = 10 // Error flagged by compiler!

• The ability to declare multiple stack objectsStack s1 (10), s2 (20), s3 (30);

• Automatic initialization & termination{

Stack s1 (1000); // constructor called automatically.// ...// Destructor called automatically

}

Page 18: C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1.

18

Drawbacks of C++ DAT• Error handling is obtrusive– use exception handling to solve this (but be careful)!

• The example is limited to a single type of stack element (int in this case)– use parameterized types to remove this limitation

• Function call overhead– use inline functions to remove this overhead

Page 19: C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1.

19

Exception Handling Implementation in C++

/* File stack.h*/typedef int T;class Stack {public:

class Underflow { /* ... */ }; // WARNING: be cautious when usingclass Overflow { /* ... */ }; // exception specifiers...Stack (size_t size);Stack (const Stack &s);void operator= (const Stack &);~Stack (void);void push (const T &item) throw (Overflow);void pop (T &item) throw (Underflow);bool is_empty (void);bool is_full (void);

private:size_t top, size; T *stack;

};

Page 20: C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1.

20

Exception Handling Implementation in C++

/* File stack.cpp */#include "stack.h"Stack::Stack (size_t s): top(0), size(s) { /*stack = allocate…*/}…

void Stack::push (const T &item) throw (Stack::Overflow) {

if (is_full ()) throw Stack::Overflow (); // guard conditionstack[top++] = item;

}void Stack::pop (T &item) throw (Stack::Underflow) {

if (is_empty ()) throw Stack::Underflow ();item = stack[--top];

}…

Page 21: C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1.

21

Exception Handling Implementation in C++

• Use case/* File main.c */

#include "stack.h" void main(void) {

Stack s1 (1), s2 (100);try {

T item;s1.push (473);s1.push (42); // Exception, full stack!s2.pop (item); // Exception, empty stack!s2.top = 10; // Access violation caught!

} catch (Stack::Underflow) { /* Handle underflow... */ }catch (Stack::Overflow) { /* Handle overflow... */ }catch (...) { /* Catch anything else... */ throw; }

}

Page 22: C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1.

22

Template Implementation in C++/* File stack.h*/template <typename T> class Stack { public:

Stack (size_t size);Stack (const Stack<T> &rhs);void operator= (const Stack<T> &rhs);~Stack (void)void push (const T &item);void pop (T &item);bool is_empty (void);bool is_full (void);

private:size_t top, size; T *stack;

};

Page 23: C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1.

23

Template Implementation in C++/* File stack.c*/template <typename T>Stack<T>::Stack (size_t size): top (0), size (size){/* allocate */ }

template <typename T>Stack<T>::~Stack (void) { /* free*/ }

template <typename T> void Stack<T>::push (const T &item) { stack[top++] = item; }

template <typename T> void Stack<T>::pop (T &item) { item = stack[--top]; }// ...

Page 24: C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1.

24

Template Implementation in C++• Use case

/* File main.c */

#include "stack.h" void main(void) {

Stack<int> s1 (1000);Stack<float> s2;

s1.push (-291);s2.top = 3.1416; // Access violation caught!

}