module : technical topics #1 2000/01scientific computing in oocourse code 3c59 module : technical...

70
Module : Technical topics #1 2000/01 Scientific Computing in OO Course code 3C59 Module : Technical topics In this module we have grouped together several unrelated technical topics. We call them "technical" as they have not much to do with the main theme of "Object Oriented" thinking. Some items for example have no relevance in Java. They must be covered as the course progresses in order to develop technical competence in the way we write C++ code. These slides will be covered as necessary during the course. However it would be a very good idea for students to try to appraise these topics in advance by themselves using these slides and the course text books.

Upload: steven-stevenson

Post on 19-Jan-2016

216 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #1

2000/01Scientific Computing in OO Course code 3C59

Module : Technical topics

In this module we have grouped together several unrelated technical topics.

We call them "technical" as they have not much to do with the main theme of "Object Oriented" thinking. Some items for example have no

relevance in Java.

They must be covered as the course progresses in order to develop technical competence in the way

we write C++ code.

These slides will be covered as necessary during the course. However it would be a very good idea

for students to try to appraise these topics in advance by themselves using these slides and the

course text books.

Page 2: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #2

2000/01Scientific Computing in OO Course code 3C59

• main( )

• #include files : user files and system files

• Organisation of classes into .h and .cpp files.

• The C pre-processor

• References

• const

• scope

• namespaces

• casting / conversion

Page 3: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #3

2000/01Scientific Computing in OO Course code 3C59

Important:

You are expected to look into these topics yourself outside of the lectures !

We cover them here only to show you what you need to know.

By all means ask questions in lectures and in surgery, but do not assume that just because you have seen it

once now then that is all you need to do.

These items are defined as part of your non-contact hour course work.

Page 4: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #4

2000/01Scientific Computing in OO Course code 3C59

Technical 1:

main( )

Page 5: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #5

2000/01Scientific Computing in OO Course code 3C59

In order to build an executable program there must exist somewhare in the code which is linked together a function called

int main( )

which returns an integer (for success or failure).

// Example main program

int main( ){ ... ... return 1 ;}

Function name and return type No arguments

(it could have, but we wont use them in this

course)

Body of function herewithin {..} always return 1

Page 6: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #6

2000/01Scientific Computing in OO Course code 3C59

There must be exactly 1 and only 1 main( ) function

If there are more the linker will complain. This is a common problem whioch arises if you include two files,

each of which has a main( ) function.

Page 7: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #7

2000/01Scientific Computing in OO Course code 3C59

Technical 2:

#include

Page 8: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #8

2000/01Scientific Computing in OO Course code 3C59

• The #include directive in any file tells the pre-processor to include the contents of that file at this point.

• This happens before the compiler sees the file. In other words by the time the compiler runs it is as if there was one big file with all the #included replaced by the relevant code.

• #include directives normally appear at the top of a file.

• The following slides show the most common uses of #include files

Page 9: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #9

2000/01Scientific Computing in OO Course code 3C59

Use of a class in a main function

#include “ThreeVector.h”

int main( ){ ~~~~~~~~ ~~~~~~~~ ~~~~~~~~

ThreeVector vec ;

~~~~~~~~ ~~~~~~~~ ~~~~~~~~

}

“main” .cpp file

class ThreeVector { ~~~~~~~~~~ ~~~~~~~~~~ ~~~~~~~~~~} ;

ThreeVector.h

definitions included in main file whenever you

need these classes

kee in separate file for ease of

organisation and

maintenance

can be re-used inmany differentapplications

Page 10: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #10

2000/01Scientific Computing in OO Course code 3C59

Use of a class by another class in its declaration

#include “ThreeVector.h”

class Particle {

private:

ThreeVector vec ;

public:

~~~~~~~~ ~~~~~~~~ ~~~~~~~~

};

Particle.h file

class ThreeVector { ~~~~~~~~~~ ~~~~~~~~~~ ~~~~~~~~~~} ;

ThreeVector.h

definition included in another .h file

Page 11: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #11

2000/01Scientific Computing in OO Course code 3C59

• There is another way to #include things.

• This is used when you are including "files known to the system". These are typically files like iostream, or cmath.

• The system keeps these in a special directory which it knows about

• You tell the pre-processor to include from there using the <..> format:

#include <iostream>#include <cmath>

int main() {

... your code using ...

return 1 ;}

Page 12: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #12

2000/01Scientific Computing in OO Course code 3C59

Technical 3:

Organisation of classes into .h and .cpp files

Page 13: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #13

2000/01Scientific Computing in OO Course code 3C59

Earlier in the course modules we wrote a classes completely in

one file.

This means that we wrote something like this in a single .h file

In particular we wrote all the code for each method directly inline as part of the class { ..} structure

class ThreeVector { private: double px, py, pz ;

public:

double magnitude( ) { ~~~~~~~~ }

double dotProduct( ThreeVector rhs ) { ~~~~~~~~ }

...other methods....};

ThreeVector.h file

Page 14: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #14

2000/01Scientific Computing in OO Course code 3C59

In practice C++ classes are not written this way.

There are several reasons, but the simplest is just clarity.

You can well imagine that if there are several complex methods in a class, then the .h file becomes unreadable, and it is difficult

to see at a glance what methods the class possesses

(..although in Jave you can only do it this way...)

Page 15: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #15

2000/01Scientific Computing in OO Course code 3C59

This is avioded by splitting the

declaration from the definition (or implementation)

class ThreeVector { private: double px, py, pz ;

public:

double magnitude( );

double dotProduct( .. );

...other method ... declarations};

ThreeVector.h file

#include "ThreeVector.h"

// Here we put all of the// code needed to implement// the methods ~~~~~~~~ ~~~~~~~~ ~~~~~~~~ ~~~~~~~~ ~~~~~~~~ ~~~~~~~~ ~~~~~~~~ ~~~~~~~~ ~~~~~~~~

ThreeVector.cpp file

Page 16: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #16

2000/01Scientific Computing in OO Course code 3C59

The declaration (.h) file looks like this:

class ThreeVector { private: double px, py, pz ;

public:

double magnitude( );

double dotProduct( .. );

...other method ... declarations};

ThreeVector.h file Only method signatures are given: name, arguments return type

followed by a

;

No code is provided between {....} brackets as was previously done

In other words we promise that a method will be provided with the given signature, but this tells the compiler that it will be found

somewhare else in its travels.

Page 17: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #17

2000/01Scientific Computing in OO Course code 3C59

class ThreeVector { private: double px, py, pz ;

public:

double magnitude( );

double dotProduct( .. );

...other method ... declarations};

ThreeVector.h file This .h file is now short and readable. It tells the

programmer very clearly what methods the class provides.

It can also be included as before into any other files

which want to use the ThreeVector class.

Such files only need the declaration of the method

signatures to work, and do not rely in any way on the

implementation of those methods.

Page 18: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #18

2000/01Scientific Computing in OO Course code 3C59

#include "ThreeVector.h"

// Here is the code for the magnitude method

double ThreeVector::magnitude(){ return sqrt( px*px + py*py + pz*pz ) ;}

// Here is code for dotProduct method

double ThreeVector::dotProduct( ThreeVector rhs ){ return ( px*rhs.px + py*rhs.py + pz*rhs.pz ) ;}

ThreeVector.cpp file

The definition (.cpp) file looks like this:(I call this the implementation file also)

Page 19: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #19

2000/01Scientific Computing in OO Course code 3C59

#include "ThreeVector.h"

// Here is the code for the magnitude method

double ThreeVector::magnitude(){ return sqrt( px*px + py*py + pz*pz ) ;}

// Here is code for dotProduct method

double ThreeVector::dotProduct( ThreeVector rhs ){ return ( px*rhs.px + py*rhs.py + pz*rhs.pz ) ;}

ThreeVector.cc file

The .cpp file always #includes the .h file

Page 20: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #20

2000/01Scientific Computing in OO Course code 3C59

#include "ThreeVector.h"

// Here is the code for the magnitude method

double ThreeVector::magnitude(){ return sqrt( px*px + py*py + pz*pz ) ;}

// Here is code for dotProduct method

double ThreeVector::dotProduct( ThreeVector rhs ){ return ( px*rhs.px + py*rhs.py + pz*rhs.pz ) ;}

ThreeVector.cc file

Here is something really new:

This is because you have to tell the

compiler which class this magnitude method is for

Remember you can write a magnitude method for many

classes (eg a ComplexNumber

class)

When the compiler reaches this file it

has no other way of knowing which one you are supplying.

Therefore you tell it by prefixing the

method name with the

classname::

Page 21: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #21

2000/01Scientific Computing in OO Course code 3C59

util/ThreeVector.h

ThreeVector.cpp

For a complete and detailed example look now at the ThreeVector files supplied by the course tutor

Ignore the things called constructors for nowThese are covered in the next module

From this point on you should write all of your classes in this way

You should re-write all of the Comton analysis classes you have written to be

like this now.

Page 22: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #22

2000/01Scientific Computing in OO Course code 3C59

Technical 4:

The C pre-processor

Page 23: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #23

2000/01Scientific Computing in OO Course code 3C59

Wherever it encounters a # directive it takes some action and edits the copy

The C pre-processor is invoked each time you compile a file.It takes actions on the file BEFORE actually trying to compile it

Think of it as starting by taking the file you have passed it, and effectively copying it to a temporary version that it is going to edit for you.

Yourfile

Copyoffile

Only when it has finished with all of the # directives will it actually then compilethe copy of the file

Page 24: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #24

2000/01Scientific Computing in OO Course code 3C59

#define XXXX YYYY

~~~~~~~~~~~~~~

~~~~~XXXX~~~~

~~~~~~~

int a = XXXX;

~~~~~~~

#define BEFORE PRE-PROCESSOR ACTION

Page 25: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #25

2000/01Scientific Computing in OO Course code 3C59

~~~~~~~~~~~~~~

~~~~~YYYY~~~~

~~~~~~~

int a = YYYY;

~~~~~~~

#define AFTER PRE-PROCESSOR ACTION

NOTE: no semi-colons are needed. Thw # directives are NOT language statements

Page 26: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #26

2000/01Scientific Computing in OO Course code 3C59

#include “Wombat.h”

#include “Wombat.cpp”

~~~~~~~...your code....~~~~~~~

#include BEFORE PRE-PROCESSOR ACTION

//--------------class Wombat { float tailLenght ; float cuteness ; ....} ;

filename: Wombat.h

//..............void Wombat::cuddle( ){ // code to cuddle wombat return ;}

filename: Wombat.cpp

Page 27: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #27

2000/01Scientific Computing in OO Course code 3C59

class Wombat { float tailLength; float cuteness; ....} ;

void Wombat::cuddle( ){ // code to cuddle wombat return ;}

~~~~~~~...your code....~~~~~~~

#include AFTER PRE-PROCESSOR ACTION

//--------------class Wombat { float tailLength; float cuteness; ....} ;

filename: Wombat.h

//..............void Wombat::cuddle( ){ // code to cuddle wombat return ;}

filename: Wombat.cpp

Page 28: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #28

2000/01Scientific Computing in OO Course code 3C59

#include “ThreeVector.h”

#include “ThreeVector.h”

#ifndef /#endif BEFORE PRE-PROCESSOR ACTION

#ifndef __threevec__

#define __threevec__ 1//--------------class ThreeVector { ... ...} ;

#endif

filename: threevec.h

Page 29: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #29

2000/01Scientific Computing in OO Course code 3C59

#ifndef __threevec__

#define __threevec__ 1//--------------class ThreeVector { ... ...} ;#endif

#ifndef __threevec__

#define __threevec__ 1//--------------class ThreeVector { ... ...} ;

#endif

#ifndef /#endif AFTER PRE-PROCESSOR PERFORMS #include(s)

#ifndef __threevec__

#define __threevec__ 1//--------------class ThreeVector { ... ...} ;

#endif

filename: threevec.h

Page 30: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #30

2000/01Scientific Computing in OO Course code 3C59

#define __threevec__ 1//--------------class ThreeVector { ... ...} ;

#ifndef __threevec__

#define __threevec__ 1//--------------class ThreeVector { ... ...} ;

#endif

#ifndef /#endif AFTER PRE-PROCESSOR HITS FIRST #ifndef/#endif

Page 31: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #31

2000/01Scientific Computing in OO Course code 3C59

#define __threevec__ 1//--------------class ThreeVector { ... ...} ;

#ifndef /#endif AFTER PRE-PROCESSOR HITS SECOND #ifndef/#endif

Page 32: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #32

2000/01Scientific Computing in OO Course code 3C59

#ifndef /#endif

#ifndef __threevec__

#define __threevec__ 1

//--------------class ThreeVector { ... ...} ;

#endif

In other words

is a scheme to make sure that this file NEVER get included twice.

[It is not important to follow it exactly now, merely to recognisethe formation, and know why you need it]

Page 33: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #33

2000/01Scientific Computing in OO Course code 3C59

Technical 5:

References

Page 34: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #34

2000/01Scientific Computing in OO Course code 3C59

C++ introduces a new way of referring to an instance of a variable or object

This is via a

reference

Page 35: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #35

2000/01Scientific Computing in OO Course code 3C59

// create an integer

int a ;

// Now create another name for the // same integer

int& b = a ;

In the simplest form references get introduced like this:

a

grab memory forand integer and labels it as "a"

b

"b" is just another label for the same memory

b is a "reference".

int& means "make a label to reference an integer"

a and b are synonyms for the same thing

Page 36: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #36

2000/01Scientific Computing in OO Course code 3C59

WARNING !

- the use of & here has

a completely different meaning to

the use of & in code to "take the address of"as appears with pointers

This is designed to confuse you

Page 37: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #37

2000/01Scientific Computing in OO Course code 3C59

int a;int & b = a;

a = 25 ;

...

b = 41 ; //same thing as putting a = 41

• a and b can both be used just like any ordinary integer

a and b are synonyms for the same variable

Page 38: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #38

2000/01Scientific Computing in OO Course code 3C59

int a;int & b = a;

a = 5 ;b = 4 ;

What is the value of a ?

int a;int & b = a;int c ;

b = 10 ;c = 5 ;a = c ;

What is the value of b ?

Page 39: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #39

2000/01Scientific Computing in OO Course code 3C59

Exactly the same rules apply for objects

// create a Thing

Thing t ;

// Now create another name for the // same Thing

Thing& r = t ;

r and t are synonyms for the same object. You can write:

t.methodName(..)or

r.methodName(..)

Page 40: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #40

2000/01Scientific Computing in OO Course code 3C59

Before you wonder what the point of this is, please note

(i) you almost never use it in this simple way to make two names for the same thing in one bit of code

in fact it would be a particularly stupid thing to do !

we only show this to see how it works in the simplest situation

(ii) it is most commonly used for argument passing as we will see on the next slides...

(iii) it is also used extensively in the context of operator overloading, which is covered in a later section, and with copy constructors.

Page 41: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #41

2000/01Scientific Computing in OO Course code 3C59

Consider a hypothetical Matrix class, and a function called normalise (details are irrelevant here) which, unsuprisingly, normalises an matrix

Matrix myMat ;

// normalise the matrix...

normalise( myMat ) ;

You might think the normalise funtion could look like this:

void normalise( Matrix m ){

// some code to normalise

}

However this WONT do what you want it

to do.!

Page 42: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #42

2000/01Scientific Computing in OO Course code 3C59

To understand why we have to go over a detail of how C++ works

The problem arises because when you pass arguments to functions, you actually pass a copy of the thing in question

Matrix myMat ;

normalise( myMat ) ;

myMat

This makes an areain memory labeledas myMat

This makes a temporary copy of myMat internally to the normalise function Copy

ofmyMat

normalise then works only on the copy, which is deleted as soon as normalise returns

As a result, if you want to CHANGE the thing you are passing, you cannot send it in as an argument like this

Page 43: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #43

2000/01Scientific Computing in OO Course code 3C59

Matrix myMat ;

// normalise the matrix...

normalise( myMat ) ;

void normalise( Matrix m ){

// some code to normalise

}

So in this example, myMat is not changed by the call to normalise

Page 44: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #44

2000/01Scientific Computing in OO Course code 3C59

Matrix myMat ;

// set m to something...

normalise( myMat ) ;

void normalise( Matrix& m ){

// some code to normalise

}

If instead you modify the normalise function like this

then only a reference to myMat is passed

m becomes a synonym for myMat itself

myMat can be modified

no copying of large matrix

Page 45: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #45

2000/01Scientific Computing in OO Course code 3C59

If this seems confusing, it may be helpful to keep the following simple picture in mind:

When you pass any argument to a function, imagine the following "hidden line" being inserted in the function itself

Matrix myMat ;

// set m to something...

normalise( myMat ) ;

void normalise( Matrix& m )

Matrix & m = myMat ;

{ // some code to normalise}

Page 46: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #46

2000/01Scientific Computing in OO Course code 3C59

If yuo did not have the reference in it would be like this:

Matrix myMat ;

// set m to something...

normalise( myMat ) ;

void normalise( Matrix m )

Matrix m = myMat ;

{ // some code to normalise}

Page 47: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #47

2000/01Scientific Computing in OO Course code 3C59

A key point is that:

•you only needed to modify the code for the method

•you did not need to modify the code which used it

In fact as the user of a method you dont care whether internally the method uses a copy of the object or a reference !

You will see exactly this technique used in copy constructors and operator overloading.

YOU should also consider using it in your own functions in order to avoid making temporary copies of large objects.

Page 48: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #48

2000/01Scientific Computing in OO Course code 3C59

References must always be set to refer to a legitimate item. You cannot declare an "empty" reference.

In other words you cannot do this:

Initialisation of references

int a = 10;

int& b ;

b = a ;

You are obliged to do this

int a = 10;

int& b = a ;

Page 49: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #49

2000/01Scientific Computing in OO Course code 3C59

Technical 6:

const

Page 50: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #50

2000/01Scientific Computing in OO Course code 3C59

There are often occasions when you want to make a symbol so that it can be set once but never changed thereafter

for example PI :

// Example of scope something you want to // keep constant

int PI = 3.14159 ;

...

...

float degrees ;float radians ;

degrees = 360 * radians / 2 / PI ;

However as written there is nothing stopping PI being overwritten

with another value.

Page 51: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #51

2000/01Scientific Computing in OO Course code 3C59

To avoid this you can declare a symbol to be

const

// Example of scope something you want to // keep constant

const int PI = 3.14159 ;

...

...

float degrees ;float radians ;

degrees = 360 * radians / 2 / PI ;

Page 52: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #52

2000/01Scientific Computing in OO Course code 3C59

The following WILL NOT work(the compiler disallows it)

// Example of scope something you want to // keep constant

const int PI = 3.14159 ;

...

...

float degrees ;float radians ;

degrees = 360 * radians / 2 / PI ;

...

PI = 25 ;

Page 53: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #53

2000/01Scientific Computing in OO Course code 3C59

Similarly you can declare a REFERENCE to be const

// Example of a const reference

int a = 5 ;

const int& b = a ;

...

...

a = 7 ; // this is allowed

b = 8 ; // this is NOT allowed

Page 54: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #54

2000/01Scientific Computing in OO Course code 3C59

As usual, the relevance of const references is not the simple example shown, but in argument passing.

VERY often you see the following:

// Example of a method which receives a const reference

float ThreeVector::dotProduct( const ThreeVector& otherVector ){

float prodsq ;

prodsq = x*otherVector.x + y*otherVector.y + z*otherVector.z ;

return sqrt( prodsq ) ;

}

The purpose of this is:(i) the argument is passed by reference to avoid a copy

(ii) the reference is made const to promise that the method will not change the argument in any way

Page 55: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #55

2000/01Scientific Computing in OO Course code 3C59

• const references are ALWAYS used in copy constructors

// Copy constructor

ThreeVector::ThreeVector( const ThreeVector& source ){

x = source.x ; y = source.y ; z = source.z ;

}

• We cover it here so that you recognise it when you see it

• I DO NOT expect you to do this in any course exercises if you do not wish to.

(in my opinion this is one of the most obtuse looking bits of C++ code)

Page 56: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #56

2000/01Scientific Computing in OO Course code 3C59

Technical 7:

scope

Page 57: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #57

2000/01Scientific Computing in OO Course code 3C59

We have already implicitly used the concept of scope, even though the word hasn’t been explicitly mentioned.

Scope refers to how long something exists for after it is declared.

Just because you might type

int index ;

somewhere in one file, doesn’t mean that the name “index” is known in every other file included in the whole program

- far from it in fact !

A declaration is valid ONLY within the {…} in which it was declared.

/* Example of scope. The variable can only exists in between the brackets */

{ int index ;

.. ..

}

Page 58: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #58

2000/01Scientific Computing in OO Course code 3C59

/* Example of scope. Variables only*//* exist within functions */

void function1() { int index ; .. index = … ; }

void function2() { float height ; .. height = .. ;

index = .. ;{

index is created here

index is destroyed here

OK height is created here

height is destroyed here

OK

WRONGindex doesn’t exist here

Page 59: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #59

2000/01Scientific Computing in OO Course code 3C59

/* Example of scope. */

/* Declare index globally to this file*/int index ;

void function1() { .. index = … ; }

void function2() { float height ; .. height = .. ;

index = .. ;{

If you want to have a variable known known to ALL functions in a file then one way is to declare it OUTSIDE of them all

This now works

In my opinion this is BAD

We wont declare variable outside functions in this course

Page 60: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #60

2000/01Scientific Computing in OO Course code 3C59

/* Example of scope. Variables only*//* exist within functions */

void function1() { int numberOfTimesCalled

/* increment variable each time this */ /* function is called */

numberOfTimesCalled++ ;

.. rest of code ..

}

An important consequence of scope is that you CANNOT do this

it WONT work

numberOfTimesCalled

is created afresh each time the function is

entered, and destroyed when it exits

So it only ever equals 1 !.

Page 61: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #61

2000/01Scientific Computing in OO Course code 3C59

/* Example of scope. Variables only*//* exist within functions */

void function1() { static int numberOfTimesCalled

/* increment variable each time this */ /* function is called */

numberOfTimesCalled++ ;

.. rest of code ..

}

You can do what you want to do in 2 ways

(i) declare it in the file outside the function as

shown previously

(ii) declare it as a

static

This will now work and is safe

Page 62: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #62

2000/01Scientific Computing in OO Course code 3C59

/* Scope within a file */

if( some test ){ int index ; index = … ; }

std::cout << index ;

This wont work

/* Scope within a file */

int index ;

if( some test ){ index = … ; }

std::cout << index ;

Note that this scope rule {..} applies generally, not just within function {..}

The for{..} or if{..} constructs are the same.

In fact it is true for any {..} anywhere in the code

This will work and is fine.

Page 63: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #63

2000/01Scientific Computing in OO Course code 3C59

To finish on scope

1. Read the course text book on scope

2. Declaring variables appropriately within functions is FINE,i.e outside of a for{..} loop if you want to subsequently use the variable.

3. Declaring static variables within functions is FINE

4. But declaring variables outside functions is BAD as it makes the variables visible to code in other files. Dont do this in this course.

5. If we want to pass data between functions we will use arguments.

Page 64: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #64

2000/01Scientific Computing in OO Course code 3C59

Technical 7:

namespace

Page 65: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #65

2000/01Scientific Computing in OO Course code 3C59

namespaces are easy

They are simply a way of packaging classes (and other names) so that they have a further

distinguishing name

This is most often done for reasons of organisation, or to avoid ambiguity.

Best shown by example:

Page 66: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #66

2000/01Scientific Computing in OO Course code 3C59

// a windowing class

class Master { int positionToDraw ; int size ; ...};

// Master class is used here

Master mainWindow ;

...

mainWindow.draw() ;

...

Page 67: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #67

2000/01Scientific Computing in OO Course code 3C59

// a windowing class

class Master { int positionToDraw ; int size ; ...};

// Master class is used here

Master mainWindow ;

Master evilOpponent ;

...

main.Window.add( evilOpponent ) ;

mainWindow.draw() ;

...

// a Dr Who video game class

class Master { string homePlanet ; int timeLordReincarnations; ...};

?Compiler has no way to work out what you want

Page 68: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #68

2000/01Scientific Computing in OO Course code 3C59

// a windowing class

namespace WindowTools {

class Master { int positionToDraw ; int size ; ... };}

// Master class is used here

WindowTools::Master mainWindow ;

DrWhoStuff::Master evilOpponent ;

...

main.Window.add( evilOpponent ) ;

mainWindow.draw() ;

...

// a Dr Who video game class

namespace DrWhoStuff {

class Master { string homePlanet ; int timeLordReincarnations; ... };}

Page 69: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #69

2000/01Scientific Computing in OO Course code 3C59

We have put each of our classes inside a namespace

We can put as many classes as we want inthe WindowTools namespace

We can put as many classes as we want inside the DrWhoStuff namesapce

You have already seen this without knowing what it is:

cout, cin, endl are all inside the std:: namespace

std::cout << " A message " << std::endl ;

Page 70: Module : Technical topics #1 2000/01Scientific Computing in OOCourse code 3C59 Module : Technical topics In this module we have grouped together several

Module : Technical topics #70

2000/01Scientific Computing in OO Course code 3C59

Technical 8:

casting conversion