Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


Presentation on theme: "C ++ Programming Languages Omid Jafarinezhad Lecturer: Omid Jafarinezhad Fall 2013 Lecture 2 C ++ -overview Department of Computer Engineering 1."— Presentation transcript:

1 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++

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

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

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)

6 Language Features Not Part of C++ Concurrency Persistence Garbage Collection Distribution

7 Stack Example typedef 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... Obviously not very abstract...

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

9 Data Hiding Implementation in C /* File stack.c */ #include "stack.h" staticHidden within this file static int top, size; /* Hidden within this file. */ staticHidden 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; }

10 Data Hiding Implementation in C Use case Main problems: create() first & destroy() last! – The programmer must call create() first & destroy() last! only one stack & only one type of stack – There is only one stack & only one type of stack /* File main.c */ #include "stack.h" void main(void) { T i; /* Oops, forgot to call create! */ push (10); /* Oops, forgot to call create! */ push (20); pop (&i); destroy (); }

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

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

13 Data Abstraction Implementation in C Use case Main problems: initialization, termination, or assignment  No guaranteed initialization, termination, or assignment only one type of stack  Still only one type of stack supported error handling  No generalized error handling... enforce information hiding  The C compiler does not enforce information hiding e.g., /* Violate abstraction */  s1.top = s2.stack[0]; /* Violate abstraction */ /* Violate abstraction */  s2.size = s3.top_; /* Violate abstraction */ /* File main.c */ #include "stack.h" void main(void) { /* Multiple stacks! */ Stack s1, s2, s3; /* Multiple stacks! */ T item; /* Pop from empty stack */ Stack_pop (&s2, &item); /* Pop from empty stack */ /* Forgot to call Stack_create! */ Stack_push (&s3, 10); /* Disaster due to aliasing!!! */ s2 = s3; /* Disaster due to aliasing!!! */ /* Destroy uninitialized stacks! */ Stack_destroy (&s1); Stack_destroy (&s2); }

14 Data Abstraction Implementation in C++ We can get encapsulation and more than one stack: /* File stack.h*/ typedef int T; Stack 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; };

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

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

17 Benefits of C++ DAT Data hiding & data abstraction, e.g., Stack s1 (200); // Error flagged by compiler! s1.top = 10 // Error flagged by compiler! The ability to declare multiple stack objects Stack s1 (10), s2 (20), s3 (30); Automatic initialization & termination { Stack s1 (1000); // constructor called automatically. //... // Destructor called automatically }

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

19 Exception Handling Implementation in C++ /* File stack.h*/ typedef int T; Stack class Stack { public: /*... */ class Underflow { /*... */ }; // WARNING: be cautious when using /*... */ class Overflow { /*... */ }; // exception specifiers... Stack (size_t size); Stack (const Stack &s); void operator= (const Stack &); ~Stack (void); throw (Overflow); void push (const T &item) throw (Overflow); throw (Underflow); void pop (T &item) throw (Underflow); bool is_empty (void); bool is_full (void); private: size_t top, size; T *stack; };

20 Exception Handling Implementation in C++ /* File stack.cpp */ #include "stack.h" Stack::Stack (size_t s): top(0), size(s), stack(new T[s]) {} … throw (Stack::Overflow) void Stack::push (const T &item) throw (Stack::Overflow) { throw if (is_full ()) throw Stack::Overflow (); stack[top++] = item; } throw(Stack::Underflow) void Stack::pop (T &item) throw (Stack::Underflow) { throw if (is_empty ()) throw Stack::Underflow (); item = stack[--top]; } …

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! } /* Handle underflow... */ catch (Stack::Underflow) { /* Handle underflow... */ } /* Handle overflow... */ catch (Stack::Overflow) { /* Handle overflow... */ } /* Catch anything else... */ catch (...) { /* Catch anything else... */ throw; } }


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

Similar presentations


Ads by Google