• No results found

Class 16: Function Parameters and Polymorphism

N/A
N/A
Protected

Academic year: 2021

Share "Class 16: Function Parameters and Polymorphism"

Copied!
20
0
0

Loading.... (view fulltext now)

Full text

(1)

Class 16: Function Parameters and Polymorphism

SI 413 - Programming Languages and Implementation

Dr. Daniel S. Roche United States Naval Academy

(2)

Parameter Passing Modes

Our programs are littered withfunction calls likef(x,5). This is a way ofpassing information from thecall site (where the code f(x,5)appears) to the function itself.

The parameter passing mode tells us how the information about the

arguments (e.g. x and 5) is communicated from the call site to the function.

(3)

Pass by Value

C/C++ use pass by value by default.

Java uses it for primitive types(int,boolean, etc.). v o i d f(i n t a) { a = 2*a; p r i n t(a); } i n t m a i n() { i n t x = 5; f(x); p r i n t(x); r e t u r n 0; }

What does this C++ program print?

(4)

Pass by Value

C/C++ use pass by value by default.

Java uses it for primitive types(int,boolean, etc.). v o i d f(i n t a) { a = 2*a; p r i n t(a); } i n t m a i n() { i n t x = 5; f(x); p r i n t(x); r e t u r n 0; }

(5)

Pass by Value

In this scheme, the function recievescopies of the actual parameters. The function cannot modify the originals, only its copies, which are destroyed when the function returns.

Function arguments representone-way communication from call site to function.

(6)

Pass by Reference

C++ supports reference parameters. Perl and VB use this mode by default.

sub foo { $_[0] = ” h a h a c h a n g e d b y f o o ”; } my $y = ” t h i s i s m i n e ! ”; foo($y); p r i n t $y, ”\n ”;

You can guess what this Perl program prints. . .

Similar behavior happens if we wrote void f(int &a) {...} in the previous C++ example.

(7)

Pass by Reference

C++ supports reference parameters. Perl and VB use this mode by default.

sub foo { $_[0] = ” h a h a c h a n g e d b y f o o ”; } my $y = ” t h i s i s m i n e ! ”; foo($y); p r i n t $y, ”\n ”;

You can guess what this Perl program prints. . .

Similar behavior happens if we wrote void f(int &a) {...} in the previous C++ example.

(8)

Pass by Reference

The formal parametersof the function become aliases for the actual parameters!

Normally the actual parameters must be variable names (or more generally, l-values. . . ).

Function arguments now represent two-way communication. References provide a way for functions to return multiple things.

They also avoid the (potentially expensive) overhead of copying without having to deal with pointers.

(9)

Variations

Pass by Value/Result

The initial value is passed in as a copy, and the final value on return is copied back out to the actual parameter.

Behaves like pass-by-reference, unless the actual parameter is accessed during the function call..

Pass by Sharing

This is what happens with objects in Java.

Actual and formal parameters both reference someshared data (i.e., the object itself).

But they are not aliases; functions can change the object that is referenced, but cannot setwhich object is referenced.

(10)

Pass by Value/Result

This is the default in Fortran, and for “in out” parameters in Ada: - -in file f.adb

p r o c e d u r e f(x : i n o u t I n t e g e r) i s b e g i n

x := 10; end f;

- -in file test.adb p r o c e d u r e t e s t i s y : I n t e g e r := 5; b e g i n f(y); Ada.I n t e g e r _ T e x t _ I O.Put(y); end t e s t;

(11)

Pass by Sharing

This is the default in languages like Java, for non-primitive types:

c l a s s S h a r e { s t a t i c c l a s s S m a l l { p u b l i c i n t x; p u b l i c S m a l l(i n t t h e x) { x = t h e x; } } p u b l i c s t a t i c v o i d t e s t(S m a l l s) { s.x = 10; s = new S m a l l( 2 0 ) ; } p u b l i c s t a t i c v o i d m a i n(S t r i n g[] a r g s) { S m a l l m a i n s m a l l = new S m a l l( 5 ) ; t e s t(m a i n s m a l l); S y s t e m.out.p r i n t l n(m a i n s m a l l.x); } } 10!

(12)

Pass by Sharing

This is the default in languages like Java, for non-primitive types:

c l a s s S h a r e { s t a t i c c l a s s S m a l l { p u b l i c i n t x; p u b l i c S m a l l(i n t t h e x) { x = t h e x; } } p u b l i c s t a t i c v o i d t e s t(S m a l l s) { s.x = 10; s = new S m a l l( 2 0 ) ; } p u b l i c s t a t i c v o i d m a i n(S t r i n g[] a r g s) { S m a l l m a i n s m a l l = new S m a l l( 5 ) ; t e s t(m a i n s m a l l); S y s t e m.out.p r i n t l n(m a i n s m a l l.x); } }

(13)

Parameter Passing in Functional Languages

Why haven’t we talked about parameter passing in Haskell, Scheme, etc.?

In pure functionalprogramming, it makes no difference! Scheme actually uses pass by sharing.

(14)

Parameter Passing in Functional Languages

Why haven’t we talked about parameter passing in Haskell, Scheme, etc.? In pure functionalprogramming, it makes no difference!

(15)

Method calls in objects

What does a call likeobj.foo(x)do in an OOP language such as C++ or Java?

foo must be a method defined in the class of obj.

The method also has access to what object it was called on (called this in C++ and Java).

This is syntactic sugar for having a globally-defined method foo, with an extra argument for “this”.

(16)

Overloading

Function overloading is when the same name refers to many functions. Which functionto call is determined by the types of the arguments.

c l a s s A { v o i d p r i n t() { c o u t < < ” i n A” < < e n d l; } }; c l a s s B { v o i d p r i n t() { c o u t < < ” i n B” < < e n d l; } }; v o i d foo(i n t a) { c o u t < < a < < ” i s an i n t\n ”; } v o i d foo(d o u b l e a) { c o u t < < a < < ” i s a d o u b l e\n ”; } i n t m a i n() { c o u t < < (5 < < 3) < < e n d l; A x; B y; x.p r i n t(); y.p r i n t(); foo( 5 ) ; foo( 5 . 0 ) ; }

(17)

Overloading

Function overloading is when the same name refers to many functions. Which functionto call is determined by the types of the arguments.

c l a s s A { v o i d p r i n t() { c o u t < < ” i n A” < < e n d l; } }; c l a s s B { v o i d p r i n t() { c o u t < < ” i n B” < < e n d l; } }; v o i d foo(i n t a) { c o u t < < a < < ” i s an i n t\n ”; } v o i d foo(d o u b l e a) { c o u t < < a < < ” i s a d o u b l e\n ”; } i n t m a i n() { c o u t < < (5 < < 3) < < e n d l; A x; B y; x.p r i n t(); y.p r i n t(); foo( 5 ) ; foo( 5 . 0 ) ; }

(18)

Polymorphism

Sybtype polymorphism is like overloading, but the called function depends on the object’s actual type, not its declared type!

Each object stores a virtual methods table (vtable) containing the address of every virtual function.

This is inspectedat run-time when a call is made. See section 9.4 in your book if you want the details.

(19)

Polymorphism example in C++

c l a s s B a s e { v i r t u a l v o i d aha() = 0; }; c l a s s A :p u b l i c B a s e { v o i d aha() { c o u t < < ” I ’m an A ! ” < < e n d l; } }; c l a s s B :p u b l i c B a s e { v o i d aha() { c o u t < < ” I ’m a B ! ” < < e n d l; } } i n t m a i n(i n t a r g c) { B a s e* x;

i f (a r g c == 1 ) // can’t know this at compile-time!

x = new A; e l s e

x = new B;

x.aha(); // Which one will it call? }

(20)

Class outcomes

You should know:

The differences between the four parameter passing modes we have discussed

How class method calls are typically interpreted by compilers How overloading works with operators, classes, and functions What subtype polymorphism is and its benefits and drawbacks You should be able to:

Follow and create programming examples demonstrating pass by value vs. pass by reference

References

Related documents

U bolesnika s rizikom od nastanka OA ili koji imaju počet- nu fazu OA koljena gubitak tjelesne mase može djelovati na smanjenje razvoja OA koljena.. Multicentrična,

gallica, two isolates of each of the remaining four northeastern North American Armillaria species (A. solidipes) were analyzed, for a total of 32 isolates used in this study

Design Objects, Class hierarchy, inheritance, polymorphism, object relationships and associations, aggregations and object containment, object persistence, meta-classes,

The results are expected to replicate the relation between sexual victimization, PTSD, and sexual risk-taking behavior in college students and extend the literature by

- If we want an object to look in the function table for the constructed class, not the variable type (often a base type) we make the function “virtual”. ▪a non-virtual method call

• Th e fi lter options are located in the upper left portion of the PivoTable as drop down menus (click the icon to the right of “FT.” By defualt, you will have only one to

The curriculum for students enrolled in a manicurist and pedicurist course shall consist of four hundred (400) clock hours of technical instruction and practical

repairing identity work for these individuals (not just the name-bearer), something not previously highlighted in identity studies. Resistance ranges from outright rejection, or