informatica 3 -...

Post on 16-Oct-2019

2 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

9/15/0710/27/07

Marcello Restelli

Laurea in Ingegneria InformaticaPolitecnico di Milano

Informatica 3

2

Structuring the Data

In a programming language are organized through the concept of typeType specifies a set of values and a set of operations for a variableProgram entities (or objects) are instances of typesType available in programming languages are

Built-in types and primitive typesData aggregates and constructorsUser defined types and abstract data typesType systems

Examples of declarationx, y, z: T;T x, y, z;

3

Built-in Types

All the programming languages provide a set of built-in typesbooleancharactersintegersreals

Allow to classify the data used in a programProtect data from illegal operations

4

Advantages of Built-in Types

Hiding of underlying representationname versus structurespecification versus implementationIndependence of client from serverWe can change implementation without changing interface and use

which implies modifiability and portability

Correct use of variables can be checked at compile time (if type is known)

improve code reliabilitynot any error can be identified at compile-time

Examplex := i/j can be checked for type correctness but the condition j!=0 cannot be checked

Resolution of overloaded operators at compile-time x := y * z;

5

Primitive Types

Primitive types are atomic typesthey are usually defined by language/machine

Often they are the built-in types, but there are exceptions (e.g., char and strings in Ada)It is possible to define new types

define the values for the new typeoperations (depending on the programming language)Example

enumerative types

6

Enumerative Types

Ordinal type whose values are defined by the userThe only admissible operations are

succ, pred, <

Exampleenum color {white, yellow, red, green};

The elements are sorted according to their declaration orderwhite < yellow < red < green

7

Data aggregate

From primitive types we can derive aggregate typesEach aggregate has a nameIt is possible to aggregate homogeneous and heterogeneous typeConstructors for compound values and typesOperations on entire aggregateSelection of components possible

8

Type Constructors (1)

Cartesian productA1 x A2 x ... x AnExamples

complex numbersCartesian point

Language constructors: record, struct, ...

Finite mapping maps a domain type into a range type: DT→RTDomain is finiteArrays of most languagesIs DT fixed at

Compile-time?

Object creation/ instantiation time?Or object manipulation time?

Is DT only subrange of integers?Is DT extensible at runtime?

9

Type Constructors (2)

(Discriminated) unionA1 A2 A3∪ ∪Disjunction of valuesSimilar to Cartesian products but fields are mutually exclusiveWhat is the type of the object at runtime?Requires runtime type checking for correct operation

union u (int i, float f);

Recursionis a structuring mechanism for defining aggregates whose size can grow arbitrarilyit can be obtained by means of pointers

one of the components is a pointer to the object

Example: typedef struct { int val; int_list* next;} int_list;int_list* head;

10

Problem with Pointers

Pointers are often used to implement recursive structuresPointers establish a dependency between two objects. It is important for the object to exist as long as the pointer points to itMemory leaks

(object exists, but can’t be reached)

Dangling pointers(pointer to deallocated area)

int* px;void trouble ();{ int x; ... px= &x; ... return;}

main( ){ trouble (); // x is deallocated // px is dangling}

11

User-defined Types

Primitive or aggregated types that are associated to a nameExample

type declaration: enum bool {FALSE, TRUE};

variable declaration: bool b;

Advantagesreadabilitymodifiabilityfactorization(limited) specification of the semantics of a variable

Disadvantagesthe new type is not protected against illegal and undesired operationsinternal representation is visible

12

Abstract Data Types

ADT is a data type that is accessible only through its interfaceDeveloping programs by means of high-level abstractions

a distinction is kept between conceptual transformations of data and their representation and their algorithmic implementationabstract mechanisms for specific applications useful to solve problems in many different applicative domains

13

ADT in C++

Class constructextension of the struct construct in which fields can be both data and routinesonly some of the data/routines can be accessible by the extern

other fields are hidden

a class has both a public and a private partthe set of public functions is the interface of the classdefinition and implementation can be compiled separately

definition ≠ interface

class point {private: float x, y;

public: point (float a, float b) {x = a; y = b;}; void x_move (float a) {x += a;}; void y_move (float b) {y += b;}; void reset () { x = y = 0.0;};};

14

ADT in C++: An Example

A stack is an ADT in which it is possible

to insert an element (push)increases the stack size of 1

to delete the last inserted element (pop)

decreases the stack size of 1

LIFO policy

class stack{ private: int* p; int* top; int size; public: stack (int n) {top = p = new int[size = n];} ~stack() {delete [ ] p;} void push(int i) {(*top++) = i;} int pop() {return *--top;} …}

15

Object Lifetime

At constructionObject is allocated,Then, attributes are initialized as specified by constructorAllocation can be automatic or explicit (via new)

At destructionObject attributes are cleanedThen, the object is deallocatedDeallocation can be automatic or explicit (via delete)

16

Object Constructor

Constructors have the same name as type being definedThere can be many, with different signaturesDefault constructors are provided if none explicitly definedExample:

stack (int n){ top = p = new int[size = n];}

17

Copy Constructor

It is a special kind of constructorIt differs from assignment since object does not exist yetBuilds an object from an existing one, whose copy is constructedIt is also used for parameter passing

Two notationspoint p1 = p2;point p1(p2);

point(const point& p) { // x and y private parts // of the object itself x = p.x; y = p.y;}

18

Object Destructor

Destructors have the same name as the class being defined, prefixed by ~Performs cleanup actions after last use of an objectThere can be only one destructor for a classDefault destructor exists if not providedExample:

~stack() {delete [] p;}

19

Assignment

C++ uses memberwise copy of attributes by default;We say that copy is shallowThis works well for classes like point, but if the class contains pointers...

We need a customized assignment operator

void f(){ stack s1(20), s2(30); s1 = s2; //array referred to by //s1 is lost it is not // deleted upon exit //from block};

20

Assignment Operations for Objects

class stack{ ... public: stack (int n) {top = p = new int[size = n];} ~stack() {delete [ ] p;} stack& operator=(const stack&); ...}

stack& stack::operator=(const stack& s){ //to cover s = s; if (this != &s) { delete [ ] p; p = s.p; top = s.top; size = s.size; return *this; }}

21

Assignment Operations for Objects by Cloning

class stack{ ... public: stack (int n) {top = p = new int[size = n];} ~stack() {delete [ ] p;} stack& operator=(const stack&); ...}

stack& stack::operator=(const stack& s){ //to cover s = s; if (this != &s) { delete [ ] p; p = new int[size = s.size]; top = p + s.top - s.p; for (int i = 0; i<(top-p); ++i) {p[i] = s.p[i];} return *this; }}

22

Friend Functions in C++

Suppose we have two classes for vector and matrixWe need to define multiplication between a vector with a matrixWhere should it be placed?

Does it belong to matrix?Does it belong to vector?

Global? No, it would have no access to private attributesMultiplication is declared friend of bothclass matrix { ... friend vector multiplication(const matrix&, const vector&); //can be placed in either private or public part}class vector { ... friend vector multiplication(const matrix&, const vector&); //can be placed in either private or public part}

23

Friend Functions in C++

Suppose we have two classes for vector and matrixWe need to define multiplication between a vector with a matrixWhere should it be placed?

Does it belong to matrix?Does it belong to vector?

Global? No, it would have no access to private attributesMultiplication is declared friend of bothvector multiplication(const matrix& m, const vector& v);{ // assume 0..3 matrix and vector vector r; for (int i = 0; i<3, i++) { //r[i] = m[i] * v r.elem(i) = 0 for (int j = 0, j<3; j++) r.elem(i) += m.elem(i, j) * v.elem(j); } return r;}

24

Generic ADT

template<class T>class Stack{public: // constructor Stack(int sz) {top = s = new T[size = sz];} // destructor ~Stack() {delete[ ] s;} void push(T el) {*top++ = el;} T pop() {return *--top;} int length() {return top - s;}private: int size; T* top; T* s;};

void foo(){ Stack<int> int_st(30); Stack<item> item_st(100); ... int_st.push(9); ...}

ADT that are parametric w.r.t. the type of their behaviorC++: templates

25

Generic Functions and Algorithms

C++ allows modularization based on functions, not only classesFunctions may be generic, i.e., generic functions, generic algorithmsStandard Template Library

Generic containersGeneric algorithms

26

Generic Functions

template <class T>void swap(T& a, T& b){ T temp = a; a = b; b = temp;}

int i, j;char x, y;pair<int,string> p1, p2;...//swap integersswap(i, j);//swap charactersswap(x, y);// swap pairsswap(p1, p2);

27

Java without Generics

public class oStack { private List stack = new ArrayList(); public void push(Object a) {stack.add(a);}; public Object top(){return stack.get(stack.size()-1);}; public void pop() {stack.remove(stack.size()-1);}; public String toString() { StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append('['); Iterator iterator = stack.iterator(); while (iterator.hasNext()) stringBuffer.append(iterator.next() + " "); stringBuffer.append(']'); return stringBuffer.toString(); }}

28

Java without Generics

public class Example { public static void main(String[] args) { oStack IntegerStack = new oStack(); Integer top; IntegerStack.push(new Integer(3)); IntegerStack.push(new Integer(4)); IntegerStack.push(new Integer(5)); System.out.println(IntegerStack); top = (Integer) IntegerStack.top(); //** IntegerStack.pop(); System.out.println(IntegerStack); }}

29

Java Generic ADT

class gStack<T>{ private List<T> stack = new ArrayList<T>(); public void push(T a) { stack.add(a); }; public T top() { return stack.get(stack.size()-1);}; public void pop() { stack.remove(stack.size()-1); }; public String toString() { StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append('['); for (T el : stack) stringBuffer.append(iterator.next() + ""); stringBuffer.append(']'); return stringBuffer.toString(); }}

30

Java Generic ADT

class Example{ public static void main(String [] args) { gStack<Integer> IntegerStack = new gStack<Integer>(); Integer top; IntegerStack.push(new Integer(3)); IntegerStack.push(new Integer(4)); IntegerStack.push(new Integer(5)); System.out.println(IntegerStack); top = IntegerStack.top(); IntegerStack.pop(); System.out.println(IntegerStack); }}

31

Java Generics: Implementation

Generics are implemented by the Java compiler as a front-end conversion called erasureErasure is the process of translating or rewriting code that uses generics into non-generic codeThus erasure maps the new syntax to the current JVM specificationThis conversion erases all generic type information all information between angle brackets is erased. For example, LinkedList<Integer> will become LinkedList. Uses of other type variables are replaced by the upper bound of the type variable (for example, Object), and when the resulting code is not type correct, a cast to the appropriate type is inserted.

32

Java Generics vs C++ Template

Java generics look like the C++ templates, but they are not the same.Java Generics

They provide compile-time type safety and eliminate the need for casts.The main difference is encapsulation: errors are flagged where they occur and not later at some use site, and source code is not exposed to clients.Use type erasure: the compiler keeps track of the generics internally, and all instances use the same class file at compile/run time.

C++ templateThey are macrosWhenever a template class is instantiated with a new class, the entire code for the class is reproduced and recompiled for the new class.

top related