CSE 3302 Programming Languages Lecture 5: Control

Similar documents
CSE 504. Expression evaluation. Expression Evaluation, Runtime Environments. One possible semantics: Problem:

Expressions and Statements. Department of CSE, MIT, Manipal

Programming Languages Third Edition. Chapter 9 Control I Expressions and Statements

Chapter 7 Control I Expressions and Statements

CS 330 Lecture 18. Symbol table. C scope rules. Declarations. Chapter 5 Louden Outline

Module 27 Switch-case statements and Run-time storage management

CSE 504: Compilers. Expressions. R. Sekar

Design Issues. Subroutines and Control Abstraction. Subroutines and Control Abstraction. CSC 4101: Programming Languages 1. Textbook, Chapter 8

CS558 Programming Languages Winter 2018 Lecture 4a. Andrew Tolmach Portland State University

CS558 Programming Languages

G Programming Languages - Fall 2012

LECTURE 17. Expressions and Assignment

Programming Languages Third Edition. Chapter 7 Basic Semantics

Programming Languages Third Edition. Chapter 10 Control II Procedures and Environments

Data Types (cont.) Subset. subtype in Ada. Powerset. set of in Pascal. implementations. CSE 3302 Programming Languages 10/1/2007

Weeks 6&7: Procedures and Parameter Passing

G Programming Languages - Fall 2012

Attributes, Bindings, and Semantic Functions Declarations, Blocks, Scope, and the Symbol Table Name Resolution and Overloading Allocation, Lifetimes,

LECTURE 18. Control Flow

Names, Bindings, Scopes

UNIT 3

The SPL Programming Language Reference Manual

IMPORTANT QUESTIONS IN C FOR THE INTERVIEW

Concepts Introduced in Chapter 7

Class Information ANNOUCEMENTS

Procedural programming with C

COP4020 Programming Languages. Subroutines and Parameter Passing Prof. Robert van Engelen

Review of the C Programming Language

Topic IV. Parameters. Chapter 5 of Programming languages: Concepts & constructs by R. Sethi (2ND EDITION). Addison-Wesley, 1996.

Topic IV. Block-structured procedural languages Algol and Pascal. References:

CIT Week13 Lecture

CSc 520 Principles of Programming Languages. 26 : Control Structures Introduction

Semantics (cont.) Symbol Table. Static Scope. Static Scope. Static Scope. CSE 3302 Programming Languages. Static vs. Dynamic Scope

G Programming Languages Spring 2010 Lecture 4. Robert Grimm, New York University

1 Lexical Considerations

Informatica 3 Syntax and Semantics

TYPES, VALUES AND DECLARATIONS

Review of the C Programming Language for Principles of Operating Systems

References and pointers

Flow Control. CSC215 Lecture

Short Notes of CS201

SE352b: Roadmap. SE352b Software Engineering Design Tools. W3: Programming Paradigms

G Programming Languages - Fall 2012

Why Pointers. Pointers. Pointer Declaration. Two Pointer Operators. What Are Pointers? Memory address POINTERVariable Contents ...

Chapter 9 Subprograms

CS201 - Introduction to Programming Glossary By

Semantics. Names. Binding Time

UNIT V Sub u P b ro r g o r g a r m a s

3. Java - Language Constructs I

HANDLING NONLOCAL REFERENCES

Dynamic Allocation in C

Chapter 8 ( ) Control Abstraction. Subprograms Issues related to subprograms How is control transferred to & from the subprogram?

CS240: Programming in C

Types II. Hwansoo Han

Pointers, Dynamic Data, and Reference Types

Data Types (cont.) Administrative Issues. Academic Dishonesty. How do we detect plagiarism? Strongly Typed Languages. Type System

Principles of Programming Languages

CS 314 Principles of Programming Languages

SYSC 2006 C Winter 2012

22c:111 Programming Language Concepts. Fall Types I

Chapter 5. Names, Bindings, and Scopes

Administrivia. Introduction to Computer Systems. Pointers, cont. Pointer example, again POINTERS. Project 2 posted, due October 6

Lexical Considerations

Compiler Construction

CS 345. Functions. Vitaly Shmatikov. slide 1

CS558 Programming Languages

Answer: Early binding generally leads to greater efficiency (compilation approach) Late binding general leads to greater flexibility

Motivation was to facilitate development of systems software, especially OS development.

CSE 307: Principles of Programming Languages

Introduction to C. Robert Escriva. Cornell CS 4411, August 30, Geared toward programmers

CS558 Programming Languages

known as non-void functions/methods in C/C++/Java called from within an expression.

COMP26120: Pointers in C (2018/19) Lucas Cordeiro

NOTE: Answer ANY FOUR of the following 6 sections:

CS558 Programming Languages. Winter 2013 Lecture 3

The PCAT Programming Language Reference Manual

Lexical Considerations

Binding and Variables

PROGRAMMAZIONE I A.A. 2017/2018

High Performance Computing in C and C++

Data Types. Outline. In Text: Chapter 6. What is a type? Primitives Strings Ordinals Arrays Records Sets Pointers 5-1. Chapter 6: Data Types 2

Programmiersprachen (Programming Languages)


CS 314 Principles of Programming Languages. Lecture 13

Variation of Pointers

CSE 303: Concepts and Tools for Software Development

Semantic Analysis. How to Ensure Type-Safety. What Are Types? Static vs. Dynamic Typing. Type Checking. Last time: CS412/CS413

Introduction to C. Sean Ogden. Cornell CS 4411, August 30, Geared toward programmers

G Programming Languages Spring 2010 Lecture 6. Robert Grimm, New York University

Compiler construction 2009

Introduction Primitive Data Types Character String Types User-Defined Ordinal Types Array Types. Record Types. Pointer and Reference Types

CSE 374 Programming Concepts & Tools. Hal Perkins Spring 2010

Programming in C - Part 2

9/21/17. Outline. Expression Evaluation and Control Flow. Arithmetic Expressions. Operators. Operators. Notation & Placement

Introduction to C. Ayush Dubey. Cornell CS 4411, August 31, Geared toward programmers

Motivation was to facilitate development of systems software, especially OS development.

Scope, Functions, and Storage Management

P.G.TRB - COMPUTER SCIENCE. c) data processing language d) none of the above

Names, Scopes, and Bindings II. Hwansoo Han

Types and Type Inference

Transcription:

CSE 3302 Programming Languages Lecture 5: Control (based on the slides by Chengkai Li) Leonidas Fegaras University of Texas at Arlington CSE 3302 L5 Fall 2009 1

Control Control: what gets executed, when, and in what order Abstractions of control: Expression Statement Exception handling Procedures and functions CSE 3302 L5 Fall 2009 2

Expression vs. Statement Difference in purity pure = no side effects given the same input, you always get the same output Expressions: no side effects returns a value Statements: side effects no returned value Functional languages aim at achieving this purity no statements - no side effects No clear-cut in most languages CSE 3302 L5 Fall 2009 3

Expressions Constructed recursively: Basic expressions (literal, identifiers) Operators, functions, special symbols Various number of operands: unary, binary, ternary operators Operators & functions: equivalent concepts (3+4)*5 (infix notation) multiply( add(3,4), 5) * ( + (3,4),5) (* (+ 3 4) 5) (Ada, prefix notation) (LISP, prefix notation) CSE 3302 L5 Fall 2009 4

Side Effects: Expressions and Side Effects changes to memory, uses input/output Side effects can be undesirable To understand a function, you need to understand how it interacts with the environment and the other functions that change the same state A program without side effects produces the same output for the same input if x=y then f(x)=f(y) Boring? Expressions: No side effects: The order of evaluating subexpressions doesn t matter (mathematical forms) Side effects: Order matters Let x = 1 What is the result of (x=x+1)+(x=x*2)? CSE 3302 L5 Fall 2009 5

Applicative Order Evaluation Also known as strict evaluation Evaluates the operands first, then applies operators bottom-up evaluation subexpressions are always evaluated, no matter whether they are needed * + - 3 4 5 6 CSE 3302 L5 Fall 2009 6

Order Matters C: int x=1; int f(void) { x=x+1; return x; main(){ printf( %d\n, x + f()); return 0; Java: class example { static int x = 1; public static int f() { x = x+1; return x; public static void main(string[] args) { System.out.println(x+f()); Many languages don t specify the order C: usually right-to-left Java: always left-to-right, but should not rely on that CSE 3302 L5 Fall 2009 7

Predictable Side Effects Assignments in expressions x = (y = z) (= is a right-associative operator) Using x++ and ++x int x=1; int f(void) { return x++; main(){ printf( %d\n, x + f()); return 0; CSE 3302 L5 Fall 2009 8

The Sequence Operator (expr1, expr2,, exprn) Left to right (this is indeed specified in C) The return value is exprn x=1; y=2; x = (x=x+1, y++, x+y); printf( %d\n,x); CSE 3302 L5 Fall 2009 9

Non-Strict Evaluation Evaluating an expression without necessarily evaluating all the subexpressions short-circuit Boolean expression e1 or e2 if-expression, case-expression CSE 3302 L5 Fall 2009 10

Short-Circuit Evaluation if (false and x) if (true or x) No need to evaluate x What is it good for? if (i <=lastindex and a[i]>=x) if (p!= NULL and p->next==q) Ada: allows both short-circuit and non short-circuit if (x /= 0) and then (y/x > 2) then... if (x /= 0) and (y/x > 2) then...? if (ptr = null) or else (ptr.x = 0) then... if (ptr = null) or (ptr.x = 0) then...? CSE 3302 L5 Fall 2009 11

if-expression if (test-exp, then-exp, else-exp) ternary operator test-exp is always evaluated first either then-exp or else-exp are evaluated, not both if e1 then e2 else e3 (ML) e1? e2 : e3 (C) What about the if-statement? CSE 3302 L5 Fall 2009 12

case-expression ML: case color of red => R blue => B green => G _ => AnyColor ; CSE 3302 L5 Fall 2009 13

Loops While loop: while (e) S; Same as: loop: if (not e) goto exit; S; goto loop; exit: The GOTO controversy Java prohibits it Do-while loop: do S while (e); Same as: { S; while (e) S; CSE 3302 L5 Fall 2009 14

Loops For-loop: for (e1; e2; e3) S; Same as: { e1; while (e2) { S; e3 eg, for (int i=0; i<10; i++) a[i]++ Most languages enforce restrictions on for-loops A break statement can be used inside a loop to exit the loop Labeled break A continue statement can be used to jump to the next loop step Labeled continue CSE 3302 L5 Fall 2009 15

Exception Handling An implicit control mechanism An exception is any unexpected or infrequent event Typically is an error event Raise (or throw) an exception: the point where the exception occurs Handle (or catch) an exception: code to be executed when a particular exception occurs Try-catch blocks in C++ struct Trouble { t; try { code that may raise an exception using 'throw' catch (Trouble t) { code that handles the Trouble exception catch (...) { code that handles the rest of all exceptions throw t; Propagating exceptions and call/stack unwinding Most languages provide predefined exceptions CSE 3302 L5 Fall 2009 16

Normal Order Evaluation Also known as lazy evaluation Operation evaluated before the operands are evaluated; Operands evaluated only when necessary int double (int x) { return x+x; int square (int x) { return x*x; Applicative order evaluation : square(double(2)) = square(4) = 16 Normal order evaluation : square(double(2)) = double(2)*double(2) = (2+2)*(2+2) CSE 3302 L5 Fall 2009 17

What is it good for? You can define if-then-else, case, etc as functions (p!=null)? p->next : NULL int if_exp(bool x, int y, int z) { if (x) return y; else return z; if_exp(p!=null, p->next, NULL); CSE 3302 L5 Fall 2009 18

Examples Call by Name (Algol60) Macro #define swap(a, b) {int t; t = a; a = b; b = t; What is the problem here? CSE 3302 L5 Fall 2009 19

Call by Name (Algol60) Macro Unhygienic Macros #define swap(a, b) {int t; t = a; a = b; b = t; main (){ int t=2; int s=5; swap(s,t); main (){ int t=2; int s=5; {int t; t = s; s = t; t = t; #define DOUBLE(x) {x+x; main() { int a; a = DOUBLE(get_int()); printf("a=%d\n", a); main() { int a; a = get_int()+get_int(); printf("a=%d\n", a); CSE 3302 L5 Fall 2009 20

Procedures vs. Functions Function: no side effects returns a value A function call is an expression Procedure: side effects no returned value A procedure call is a statement No clear distinction made in most languages C/C++: a procedure is a function that returns void Ada/FORTRAN/Pascal: procedure/function CSE 3302 L5 Fall 2009 21

Syntax Terminology: body specification interface name type of return value parameters (names and types) int f(int y) { int x; x=y+1; return x; int f(int y); int f(int y) { int x; x=y+1; return x; //declaration //definition CSE 3302 L5 Fall 2009 22

Procedure Call Caller: Callee: int f(int y){ f(a); int x; if (y==0) return 0; x=y+1; return x; At the call: control transferred from the caller to the callee Transferred back to the caller when execution reaches the end of the body Can return early CSE 3302 L5 Fall 2009 23

Runtime Environment Environment: binding from names to their attributes static(global) area stack automatically-allocated space for local variables; under the control of runtime system (unallocated) manually-allocated space; under the control of programmer heap CSE 3302 L5 Fall 2009 24

Activation Records for Nested Blocks Activation record: memory allocated for the local objects of a block Entering a block: an activation record is allocated Exit from inner block into the surrounding block: the activation record is released int x; //global { int x,y; x = y*10; { int i; i = x/2; x x y CSE 3302 L5 Fall 2009 25

Activation Records for Nested Blocks int x; //global { int x,y; x = y*10; { int i; i = x/2; x: nonlocal variable, in the surrounding activation record x x y i CSE 3302 L5 Fall 2009 26

Activation Records for Procedures int x; //global void B(void) { int i; i = x/2; void A(void) { int x,y; x = y*10; B(); main() { A(); return 0; frame for A x x y CSE 3302 L5 Fall 2009 27

Activation Records for Procedures int x; //global void B(void) { int i; i = x/2; void A(void) { int x,y; x = y*10; B(); main() { A(); return 0; x: global variable in the defining environment Need to retain information in the calling environment x x y i CSE 3302 L5 Fall 2009 28

Activation Records for Procedures int x; //global void B(void) { int i; i = x/2; void A(void) { int x,y; x = y*10; B(); main() { A(); return 0; i: local variable in the called environment x: global variable in the defining environment x,y: local variables in the calling environment x x y i CSE 3302 L5 Fall 2009 29

Activation Records for Procedures int x; //global void B(void) { int i; i = x/2; void A(void) { int x,y; x = y*10; B(); main() { A(); return 0; Can only access global variables in the defining environment No direct access to the local variables in the calling environment (Need to communicate through parameters) x x y i CSE 3302 L5 Fall 2009 30

Procedure Call Caller: Callee: int f(int a){ f(i);...;...a...;...; Parameter Passing Mechanisms: When and how to evaluate parameters How actual parameter values are passed to formal parameters How formal parameter values are passed back to actual parameters CSE 3302 L5 Fall 2009 31

Parameter Passing Mechanisms Pass/Call by Value Pass/Call by Reference Pass/Call by Value-Result Pass/Call by Name CSE 3302 L5 Fall 2009 32

Example What is the result? void swap(int a, int b) { int temp; temp = a; a = b; b = temp; main(){ int i=1, j=2; swap(i,j); printf( i=%d, j=%d\n, i, j); It depends CSE 3302 L5 Fall 2009 33

Pass by Value Caller: Callee: int f(int a){ f(i);...a...; i a This is the most common form Replace formal parameters by the values of actual parameters Actual parameters: No change Formal parameters: Local variables (C, C++, Java, Pascal) CSE 3302 L5 Fall 2009 34

Example: Pass By Value void swap(int a, int b) { int temp; temp = a; a = b; b = temp; main(){ int i=1, j=2; swap(i,j); printf( i=%d, j=%d\n, i, j); i 1 j 2 i 1 j 2 a b a 1 b 2 i 1 j 2 a 2 b 1 CSE 3302 L5 Fall 2009 35

Are these Pass-by-Value? C: void f(int *p) { *p = 0; void f(int a[]) { a[0]=0; Java: void f(vector v) { v.removeall(); CSE 3302 L5 Fall 2009 36

Pass-by-Value: Pointers C: void f(int *p) { *p = 0; main() { int *q; q = (int *) malloc(sizeof(int)); *q = 1; f(q); printf("%d\n", q[0]); q? q q 1 1 p? q 1 p q 0 p CSE 3302 L5 Fall 2009 37

Pass-by-Value: Pointers C: void f(int *p) { p = (int *) malloc(sizeof(int)); *p = 0; main() { int *q; q = (int *) malloc(sizeof(int)); *q = 1; f(q); printf("%d\n", q[0]); What happens here? CSE 3302 L5 Fall 2009 38

C: void f(int p[]) { p[0] = 0; main() { int q[10]; q[0]=1; f(q); printf("%d\n", q[0]); Pass-by-Value: Arrays What happens here? CSE 3302 L5 Fall 2009 39

Pass-by-Value: Arrays C: void f(int p[]) { p=(int *) malloc(sizeof(int)); p[0] = 0; main() { int q[10]; q[0]=1; f(q); printf("%d\n", q[0]); What happens here? CSE 3302 L5 Fall 2009 40

Pass-by-Value: Java Objects Java: void f(vector v) { v.removeall(); main() { Vector vec; vec.addelement(new Integer(1)); f(vec); System.out.println(vec.size()); What happens here? CSE 3302 L5 Fall 2009 41

Pass-by-Value: Java Objects Java: void f(vector v) { v = new Vector(); v.removeall(); main() { Vector vec; vec.addelement(new Integer(1)); f(vec); System.out.println(vec.size()); What happens here? CSE 3302 L5 Fall 2009 42

Pass by Reference Caller: Callee: int f(int a){ f(i);...a...; i a Formal parameters become alias of actual parameters Actual parameters: changed by changes to formal parameters Examples: Fortran: the only parameter passing mechanism C++ (reference type, &) /Pascal (var) CSE 3302 L5 Fall 2009 43

Example: Pass By Reference C++ syntax. Not valid in C i 1 a void swap(int &a, int &b) { int temp; temp = a; a = b; b = temp; main(){ int i=1, j=2; swap(i,j); printf( i=%d, j=%d\n, i, j); j 2 i 1 j 2 i 2 j 1 b a b a b CSE 3302 L5 Fall 2009 44

Pass-by-Reference: How to mimic it in C? C: void f(int *p) { *p = 0; main() { int q; q = 1; f(&q); printf( %d\n, q); It is really pass-by-value. Why? CSE 3302 L5 Fall 2009 45

It is really pass-by-value C: void f(int *p) { p = (int *) malloc(sizeof(int)); *p = 0; main() { int q; q = 1; f(&q); printf( %d\n, q); CSE 3302 L5 Fall 2009 46

Pass-by-Reference: C++ Constant Reference C++: void f(const int & p) { int a = p; p = 0; main(){ int q; q = 1; f(q); printf("%d\n", q); What happens here? CSE 3302 L5 Fall 2009 47

Pass-by-Reference: C++ Reference-to-Pointer C++: void f(int * &p) { *p = 0; main(){ int *q; int a[10]; a[0]=1; q=a; f(q); printf("%d, %d\n", q[0], a[0]); What happens here? CSE 3302 L5 Fall 2009 48

Pass-by-Reference: C++ Reference-to-Pointer C++: void f(int * &p) { p = new int; *p = 0; main(){ int *q; int a[10]; a[0]=1; q=a; f(q); printf("%d, %d\n", q[0], a[0]); What happens here? CSE 3302 L5 Fall 2009 49

Pass-by-Reference: C++ Reference-to-Array C++: void f(int (&p)[10]) { p[0]=0; main(){ int *q; int a[10]; a[0]=1; q = a; f(a); printf("%d, %d\n", q[0], a[0]); What happens here? CSE 3302 L5 Fall 2009 50

Pass by Value-Result Caller: Callee: int f(int a){ f(i);...a...; i a i a Combination of Pass-by-Value and Pass-by-Reference (Passby-Reference without aliasing) Replace formal parameters by the values of actual parameters Value of formal parameters are copied back to actual parameters CSE 3302 L5 Fall 2009 51

Example: Pass By Value-Result void swap(int a, int b) { int temp; temp = a; a = b; b = temp; main(){ int i=1, j=2; swap(i,j); printf( i=%d, j=%d\n, i, j); i 1 j 2 i 1 j 2 i 2 a b a 1 b 2 a 2 j 1 b 1 CSE 3302 L5 Fall 2009 52

Unspecified Issues void f(int a, int b) { a = 1; b = 2; main(){ int i=0; f(i,i); printf( i=%d\n, i); i 0 a b i 0 a 1? b 2 CSE 3302 L5 Fall 2009 53

Pass by Name Caller: Callee: int f(int a){ f(i);...a...; The actual parameters are only evaluated when they are needed The same parameter can be evaluated multiple times They are evaluated in the calling environment Essentially equivalent to normal order evaluation Example: Algol 60 Not adopted by any major languages due to implementation difficulty CSE 3302 L5 Fall 2009 54

Example: Pass By Name void swap(int a, int b) { int temp; temp = a; a = b; b = temp; main(){ int i=1, j=2; swap(i,j); printf( i=%d, j=%d\n, i, j); a (i) 1 j 2 a (i) 1 b (j) 2 a (i) 2 temp temp 1 temp 1 b (j) 2 CSE 3302 L5 Fall 2009 55

Pass-by-Name: Side Effects int p[3]={1,2,3; int i; void swap(int a, int b) { int temp; temp = a; a = b; b = temp; main(){ i = 1; swap(i, a[i]); printf( %d, %d\n, i, a[i]); What happens here? CSE 3302 L5 Fall 2009 56

Pass by Name Some Variants Evaluated at every use, in the calling environment Pass by Need Evaluated once, memorized for future use Pass by Text (Macro) Evaluated using the called environment. All belong to non-strict evaluation (lazy evaluation) CSE 3302 L5 Fall 2009 57

Comparisons Call by Value Efficient; No additional level of indirection Less flexible and less efficient without pointers array, struct, union as parameters Call by Reference Requires one additional level of indirection (explicit dereferencing) If a parameter is not variable (e.g., constant), a memory space must be allocated for it, in order to get a reference Easiest to implement Call by Value-Result You may not want to change actual parameter values when facing exceptions Call by Name Lazy evaluation Difficult to implement CSE 3302 L5 Fall 2009 58

Heap-Allocated Data Dynamic memory management The simplest heap allocator that does not reclaim storage: char heap[heap_size]; int end_of_heap = 0; void* malloc ( int size ) { void* loc = (void*) &heap[end_of_heap]; end_of_heap += size; return loc; ; CSE 3302 L5 Fall 2009 59

With a Free List Need to recycle the dynamically allocated data that are not used This is done using free in C or delete in C++ Need to link all deallocated data in the heap into a list Initially, the free list contains only one element that covers the entire heap (ie, it's heap_size bytes long) typedef struct Header { struct Header *next; int size; Header; Header* free_list; free simply puts the recycled cell at the beginning of the free list: void free ( void* x ) { ; if ("size of *x" <= sizeof(header)) return; ((Header*) x)->next = free_list; ((Header*) x)->size = "size of *x"; free_list = (Header*) x; CSE 3302 L5 Fall 2009 60

Malloc malloc first searches the free list to find a cell large enough to fit the given number of bytes. If it finds one, it gets a chunk out of the cell leaving the rest untouched: void* malloc ( int size ) { Header* prev = free_list; for (Header* r=free_list; r!=0; prev=r, r=r->next) if (r->size > size+sizeof(header)) { Header* new_r = (Header*) (((char*) r)+size); new_r->next = r->next; new_r->size = r->size; if (prev==free_list) free_list = new_r; else prev->next = new_r; return (void*) r; ; void* loc = (void*) &heap[end_of_heap]; end_of_heap += size; return loc; ; CSE 3302 L5 Fall 2009 61

Reference Counting Keeping track of pointer assignments If more than one objects point to a dynamically allocated object, then the latter object should be deleted only if all objects that point to it do not need it any more you need to keep track of how many pointers are pointing to each object Used to be popular for OO languages like C++ Note: this is not automatic garbage collection because the programmer again is responsible of putting counters to every object to count references This method is easy to implement for languages like C++ where you can redefine the assignment operator dest=source, when both dest and source are pointers to data CSE 3302 L5 Fall 2009 62

Reference Counting (cont.) Instead of using C++ for a pointer to an object C, we use Ref<C>, where the template Ref provides reference counting to C: template< class T > class Ref { private: int count; T* pointer; void MayDelete () { ; if (count==0) delete pointer; void Copy ( const Ref &sp ) { ; ++sp.count; count = sp.count; pointer = sp.pointer; public: ; Ref ( T* ptr = 0 ) : count(1), pointer(ptr) {; Ref ( const Ref &sp ) { Copy(sp); ; ~Ref () { MayDelete(); ; T* operator-> () { return pointer; ; Ref& operator= ( const Ref &sp ) { ; if (this!= &sp) { count--; MayDelete(); Copy(sp); CSE 3302 L5 Fall 2009 63 ; return *this;