c++: an object-oriented approach basic class development- cmp109 w 2007

57
1 C++: An Object-Oriented Approach Basic Class Development- CMP109 w 2007 ADTs Structures and Classes Visibility - public and private Class scope this pointer static and const member functions Containers and items access

Upload: trygg

Post on 18-Jan-2016

21 views

Category:

Documents


0 download

DESCRIPTION

C++: An Object-Oriented Approach Basic Class Development- CMP109 w 2007. ADTs Structures and Classes Visibility - public and private Class scope this pointer static and const member functions Containers and items access. today. HW – any comments , problems, interesting result - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

1

C++: An Object-Oriented ApproachBasic Class Development- CMP109 w 2007

ADTs

Structures and Classes

Visibility - public and private

Class scope

this pointer

static and const member functions

Containers and items access

Page 2: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

2

today

HW – any comments , problems, interesting result

New HW2 – talk briefly about that

Reading chapter 4 and chapter 5

Page 3: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

3

ADTs

2x3+x2+4x+27

Polynomial Stack

Window

Page 4: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

4

ADTs in the Base Language

User-defined data types

struct implements ADTs in C

OOP design involves thinking up ADTs Model key features of problem

Reusable in other code

student poker hand stack

Page 5: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

5

The Aggregate Type struct

Aggregate components into single variable

Members individually named

Members of various typesAggregates describe complicated

data

Page 6: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

6

Stack of Trays

Add to or take from top of a stack of trays

Page 7: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

7

A Standard ADT Example: stack

Insert and delete data only at top of stack

Last-in-first-out discipline (LIFO)Pile pops up or pushes down on

removal or add

Typical operations push, pop, top, empty, full

C++ implementation can use fixed length char array

Page 8: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

8

Stack Operations

push operator places value on

pop operator retrieves & deletes value

top operator returns top value

empty operator tests if stack is empty

full operator tests if stack is full

Functions with argument listPointer to stack parameter allows stack

to be modified and avoids call-by-value copying

Page 9: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

9

Stack with ABCD Pushed On

pop

push

top 3

empty -1

full 999

A

B

C

D

max_len 1000

cc

c

Page 10: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

10

Stack in the Kernel Language (1 of 3)

const int max_len = 1000;enum { EMPTY = -1, FULL = max_len - 1 };

struct ch_stack { char s[max_len]; int top;};

Page 11: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

11

Stack in the Kernel Language (2 of 3)

void reset(ch_stack* stk){ stk -> top = EMPTY;}

void push(char c, ch_stack* stk){ stk -> s[++stk -> top] = c;}

char pop(ch_stack* stk){ return (stk -> s[stk -> top--]);}

Page 12: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

12

Stack in the Kernel Language (3 of 3)

bool empty(const ch_stack* stk){ return (stk —> top == EMPTY);}

bool full(const ch_stack* stk){ return (stk —> top == FULL);}

char top(ch_stack* stk){ return (stk -> s[stk -> top]);}

Page 13: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

13

Classes and Abstract Data Types

Class is implementation of abstract data typeExtension of struct in traditional C

Implement user-defined type: functions, operators

Class members may be functionsPublic members available to any function

Private members available to member functions

Restricted access (data hiding) is OOP feature Maintenance, reliability, reuse and

modularity

Page 14: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

14

Access

foo

private data public data

private manipulation public operations

and functions

protected

derived objects

foo could be stack, complex, string, window

Page 15: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

15

ADT Approach to complex

Interface models abstraction

No commitment to representation

Seamless like native typesMixed in expressions, I/O, conversions

More reusableWritten independent of a problem choice

DownsideGenerally less efficient

Design & implementation more comprehensive

Page 16: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

16

Member Functions: Categories

Constructors/Destructors publicInitialization, conversion, store

Access Functions publicI/O and controlled manipulation of values

Auxiliary Functions private & public

Not directly needed by client but useful by other member functions

Operator & Capability Functions publicOperations performed on class

Page 17: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

17

Access and Keywords

KeywordsKeywords DefaultsDefaultsstruct public

class private

KeywordsKeywords AvailabilityAvailabilitypublic everyone

private class members and friends

protected derived classes

KeywordKeyword UseUseprivate hidden implementation

public client interface

Page 18: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

18

Heuristic for Access

Data members should be private (or protected)

Access should beprovided through inline member functions

Page 19: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

19

Example: Stack in C++ (1 of 2)

struct ch_stack {public: //operations as member functions void reset() { top = EMPTY; } void push(char c) { top++; s[top] = c;} char pop() { return s[top--]; } char top_of() { return s[top]; } bool empty() { return (top == EMPTY);} bool full() { return (top == FULL); }private: //data representation char s[max_len]; int top; enum { EMPTY = -1, FULL = max_len - 1};};

Page 20: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

20

Example: Stack in C++ (2 of 2)

main(){ ch_stack s; char str[40]={"My name is Don Knuth!"}; int i = 0;

cout << str << endl; s.reset(); //s.top = EMPTY illegal while (str[i]) if (!s.full()) s.push(str[i++]); while (!s.empty()) cout << s.pop();}

My name is Don Knuth!!htunK noD si eman yM

Page 21: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

21

Comments on the stack Program

Access to hidden variable top controlledChanged by member function resetCannot be accessed directly

Variable s passed to each member function using structure member operator form

Private part contains data description

Public part contains member functions

Page 22: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

22

Scope Resolution Operator ::

C++ inherits notions of block and scope from C

Same identifier used for different objects

Inner block hides outer block

:: variable name accesses externalScope resolution operator is

highest precedence

Page 23: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

23

Example: Scope Resolution Operator

int i = 1; // external iint main() { int i = 2; //redeclares i locally { cout << "enter inner block\n"; int n = i; int i = 3; cout << i << " i <> ::i " << ::i << "\nn = " << n << endl; } cout << "enter outer block\n"; cout << i << " i <> ::i " << ::i << endl;}

Page 24: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

24

New Class Scope

Classes provide an encapsulation technique

All names declared within a class treated as within their own name space

Distinct from external names, function names, or other class names

Need scope resolution operator

Page 25: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

25

Two Forms of Scope Resolution

Highest precedence operator

Use Form Refers to

::i unary external scopefoo_bar::i binary class scope

Provides path to identifier

No path is by default external

Page 26: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

26

Unary Form of Scope Resolution

Uncover or access name at external scope hidden by local or class scope

int count = 0; //external variable

void how_many(double w[], double x, int& count) { for (int i = 0; i < N; ++i) count += (w[i] == x); ++ ::count; //keep track of calls }

Page 27: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

27

Binary Form of Scope Resolution

Disambiguate names reused within classes

Vital to use with inheritance

class widgets { public: void f(); };class gizmos { public: void f(); };

void f() {.} //ordinary external fvoid widgets::f() {.} //f scoped to widgetsvoid gizmos::f() {.} //f scoped to gizmos

Page 28: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

28

Self Referencing

“C3PO, please bring allthe robots, except those robots that can bring themselves.”

Now What?

Page 29: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

29

The this pointer

Implicitly declared self-referential pointerthis only used in a non-static member function

Self-referentiality does not change fact that this is pointer

this—>member_name points at member object

*this is actual total objectCan be lvalue or rvalue

this is address of the object pointed at

Page 30: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

30

Example: The this pointer (1 of 2)

class c_pair {public: c_pair init(char b) {c2 = 1 + (c1 = b);} c_pair increment() {c1++; c2++; return (*this);} c_pair* where_am_I() { return this; } void print() { cout << c1 << c2 << '\t'; }private: char c1, c2;};

Page 31: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

31

Example: The this pointer (2 of 2)

int main(){ c_pair a, b; a.init('A'); a.print(); cout << " is at " << a.where_am_I() << endl; b.init('B'); b.print(); cout << " is at " << b.where_am_I() << endl; b.increment().print(); return 0;}

Page 32: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

32

Comments on the this Program

Implicitly provided pointer this used to return incremented value of c1 and c2

where_am_I returns address of given object

As if c_pair implicitly declared private member c_pair* const this

Poor practice to modify this by casting

Early C++ allowed memory management for objects controlled by assignment to this

Page 33: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

33

static and const Member Functions

Ordinary member functions have explicit and implicit argument lists

Members of the class

static member function cannot modify any members using this

Can be declared independent of any particular declarations of objects of the class type

const member function cannot modify its implicit arguments

Page 34: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

34

Example: static and const (1 of 2)

class salary {public: init(int b) { b_sal = b; } void calc_bonus(double perc) { your_bonus = b_sal * perc; } static void reset_all(int p) { all_bonus = p; } int comp_tot() const { return (b_sal + your_bonus + all_bonus); } private: int b_sal; int your_bonus; static int all_bonus; //declaration};

Page 35: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

35

Example: static and const (2 of 2)

int salary::all_bonus = 100; //declaration //and definitionint main(){ salary w1, w2; w1.init(1000); w2.init(2000); w1.calc_bonus(0.2); w2.calc_bonus(0.15); salary::reset_all(400); cout << " w1 " << w1.comp_tot() << " w2 " << w2.comp_tot() << endl; return 0;}

Page 36: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

36

Comments on the salary Program

static member all_bonus requires file scope definition

Exists independently of specific salary variables

const comes between end of argument list and front of the code body

Self-referential pointer passed as const salary* const this

Use :: to invoke static member function

Page 37: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

37

Object Creation

Object requires memory and initial value

Kernel language provides this through declarations that are definitions

void foo(){ int n = 5; double z[10] = { 0.0}; struct gizmo { int i, j; } w = { 3, 4}; . . .}

Page 38: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

38

Comments on the foo() Function (1 of 2)

Objects created at block entry when foo() is invoked

gizmo object w requires eight bytes to represent its two integer members

Array of double object z requires ten times sizeof(double) to store its elements

At exit from foo() deallocation occurs

Page 39: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

39

Comments on the foo() Function (2 of 2)

Typical implementation uses a run-time system stack

int object n on a system with four-byte integers gets this allocated off stack and initialized to 5

System provides for construction and initialization of objects

Page 40: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

40

Design

Elements of design

Relationships: similar to UML class diagrams or CRC cards

Responsibilities: behavior

Collaborations: other classes that cooperate

Page 41: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

41

Man-Page for Design Patterns (2 of 3)

Applicability Recognizing where to apply

Structure UML notation for pattern or CRC

Participants Classes or objects and responsibilities

Collaborations Participants work together

Page 42: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

42

UML - Unified Modeling Language

Graphical depiction of class relationships that helps coder design, document, and maintain object-oriented code

Simple diagram is rectangle that represents class

Depict class Name, placed at topData members, placed in middleMethods, placed at bottom

Page 43: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

43

UML

person

nameagebirthday

bday()

UML Diagram for Class person

Page 44: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

44

Handle Class in UML

ch_stk_rep

tops[ ]

push()Pop()

ch_stack

ptr

push()pop()

Page 45: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

45

Class Diagram

Describes types and relationships

Useful documentation

Some Systems provide automated tools to develop UML with coding

Rational Rose

Relationship depicted by UML includes part-whole, or aggregation, relationship (HASA)

ch_stack

ptr

push()

ch_stk_rep

tops[]

push()

Handle Class in UML

Page 46: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

46

The ch_stack Program (1 of 4)

class ch_stack {public:   void  reset() { ptr -> reset(); }   void  push(char c)      { ptr->push(c); }   char  pop() { return ptr->pop(); }   char  top_of() const { return ptr->top_of(); } 

Page 47: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

47

The ch_stack Program (2 of 4)

  bool  empty() const      { return ptr -> empty(); }   bool  full() const      { return ptr -> full(); }private:   ch_stk_rep* ptr;      // opaque pointer};

Page 48: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

48

The ch_stack Program (3 of 4)

class ch_stk_rep {public:   void  reset() { top = EMPTY; }   void  push(char c)      { s[top++] = c; }   char  pop() { return s[top--]; }   char  top_of() const { return s[top]; } 

Page 49: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

49

The ch_stack Program (4 of 4)

  bool  empty() const      { return (top == EMPTY); }   bool  full() const      { return (top == FULL); }private:   enum { max_len = 100, EMPTY = -1,           FULL = max_len - 1 };   int   top;   char  s[max_len];};

Page 50: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

50

Handle

Handle type such as ch_stack has representation class class ch_stk_rep pointer

Representation class used to concretely implement handle class

Bridge or handle design pattern

Page 51: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

51

Object Oriented Design Focus

Identification of objects

Hierarchical organization of classes

Implementation and design process merge

Reuse of objects

Control & process is not as often reusable

"There is no widely accepted OOD method"-Winblad, et. al.

Page 52: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

52

Using Existing Designs

Mathematical and scientific community standard definitions readily coded as ADTs

Complex numbers Rationals

Matrices Polynomials

Programming community has experience with standard container classes

Stack Associative array

Binary tree Queue

Page 53: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

53

Invertibility in Design

Invertibility - inverse member functions

In math, addition and subtraction are inverses

In a text editor, add and delete are inverses

Some commands are their own inverses: negation

Page 54: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

54

Success of Invertibility in Nonmath Context

Thank goodness for the UNDO command!

Use the UNDELETEfunction toget it back!

Give me back my file!

Page 55: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

55

Completeness of Design

Completeness best seen in Boolean algebra, where nand operation suffices to generate all possible Boolean expressions

Boolean algebra taught with negation, conjunction, disjunction as basic operations

Completeness by itself is not enough

Large set of operators is more expressive

Page 56: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

56

Orthogonality in Design

Each element of design should integrate and work with all other elements

Elements of basic design should not overlap or be redundant

System that manipulates shapes functions should be able to position shape anywhere

Horizontal moveVertical moveRotate operation

Page 57: C++: An Object-Oriented Approach Basic Class Development- CMP109  w 2007

57

Invest in existing libraries

Avoid deep hierarchies

Avoid whiz-bang featuresOne task: one member function

Avoid non-standard operator overloading

Dr. P’s Prescriptions