c++ for the mfe class at uc berkeley

26
C++ for the MFE class at UC Berkeley Yuli Kaplunovsky MFE, MBA, MS- Tax, CFA yuli@FinancialSimulations .com (408) 884 5965

Upload: kohana

Post on 02-Feb-2016

76 views

Category:

Documents


2 download

DESCRIPTION

C++ for the MFE class at UC Berkeley. Yuli Kaplunovsky MFE, MBA, MS-Tax, CFA [email protected] (408) 884 5965. Introduction. Based upon “Teach Yourself C++ in 21 Days” http://cma.zdnet.com/book/c++/ - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: C++  for the MFE class at UC Berkeley

C++ for the MFE class at UC Berkeley

Yuli Kaplunovsky MFE, MBA, MS-Tax, CFA

[email protected]

(408) 884 5965

Page 2: C++  for the MFE class at UC Berkeley

2

Introduction

• Based upon “Teach Yourself C++ in 21 Days” http://cma.zdnet.com/book/c++/

• C++ Workshop Sessions @ S300T (inside Computing Center)#1 - Thu April 6th 1:00PM – 3:30PM#2 - Tue April 11th 9:30AM – 12:00PM#3 - Thu April 20th 1:00PM – 3:30PM

Page 3: C++  for the MFE class at UC Berkeley

3

Sample Program #1

File name: Test.cpp

1: #include <iostream.h>2:3: int main()4: {5: cout << "Hello World!\n";6: return 0;7: }Hello World!

Page 4: C++  for the MFE class at UC Berkeley

4

Structure

struct TIME_REC{ double dHours; double dRate;};

void main(){ TIME_REC payrollRecord; payrollRecord.dHours = 40.0; payrollRecord.dRate = 3.75; cout << "This week's payroll information:" << endl; cout << "Hours worked : " << payrollRecord.dHours << endl; cout << "Rate :$" << payrollRecord.dRate << endl;

double dSalary = payrollRecord.dRate * payrollRecord.dHours; cout << "Salary :$" << dSalary << endl;}

Page 5: C++  for the MFE class at UC Berkeley

5

Declaring a Class

class Cat

{

public: unsigned int Age;

unsigned int Weight;

Meow();

};

Defining an Object unsigned int GrossWeight; // define an unsigned integer

Cat Frisky; // define a Cat

Page 6: C++  for the MFE class at UC Berkeley

6

Accessing Class Members

Frisky.Weight = 50;

Frisky.Meow(); Cat Frisky; // just like int x; Frisky.age = 5; // just like x = 5;

If You Don’t Declare It, Your Class Wont Have It Cat Frisky; // make a Cat named Frisky Frisky.Bark() // tell Frisky to bark

Page 7: C++  for the MFE class at UC Berkeley

7

Sample program #2

1: // Demonstrates declaration of a class and2: // definition of an object of the class,3:4: #include <iostream.h> // for cout5:6: class Cat // declare the class object7: {8: public: // members which follow are public9: int itsAge;10: int itsWeight;11: };12:13:14: void main()15: {16: Cat Frisky;17: Frisky.itsAge = 5; // assign to the member variable18: cout << "Frisky is a cat who is " ;19: cout << Frisky.itsAge << " years old.\n";20: }Output: Frisky is a cat who is 5 years old.

Page 8: C++  for the MFE class at UC Berkeley

8

Implementing Class Methods

void Cat::Meow(){ cout << "Meow.\n";}

Calling class function

void main(){

Cat Frisky;Frisky.Meow();

}

Page 9: C++  for the MFE class at UC Berkeley

9

Using internal variables inside class

void main(){ Cat Frisky; Cat Whisky; Frisky.itsAge = 3; Whisky.itsAge = 5;

cout << "Frisky says: "; Frisky.Meow(); cout << "Whisky says: "; Whisky.Meow();}Frisky says: Meow Meow MeowWhisky says: Meow Meow Meow Meow Meow

class Cat {public: int itsAge; int itsWeight; void Meow();}

void Cat::Meow()// the older the cat, the more noisy it is...

{ for ( int I = 0 ; I < itsAge ; I++ ) cout << "Meow "; cout << "\n";}

Page 10: C++  for the MFE class at UC Berkeley

10

Public / Privateclass Cat {public: int GetAge(); void SetAge(int age); void HappyBirthday();private: int itsAge; };

int Cat::GetAge(){ return itsAge;}

void Cat::SetAge(int age){ itsAge = age;}

void main(){ Cat Frisky; Frisky.SetAge(5); cout << "Frisky is a cat who is " ; cout << Frisky.GetAge() << " years old.\n"; Frisky.HappyBirthday(); cout << "Frisky is a cat who is " ; cout << Frisky.GetAge() << " years old.\n";}

Frisky is a cat who is 5 years old.Frisky is a cat who is 6 years old.

void Cat::HappyBirthday(){ itsAge++;}

Page 11: C++  for the MFE class at UC Berkeley

11

constructors and destructors

class Cat {public:

Cat(int initialAge); // constructor ~Cat(); // destructor int GetAge(); void SetAge(int age); void Meow();private: int itsAge;};

// constructor of CatCat::Cat(int initialAge){ itsAge = initialAge;}

Cat::~Cat() // destructor { cout << “Bye bye \n";}

int main(){ Cat Frisky(5); Frisky.Meow(); cout << "Frisky is a cat who is " ; cout << Frisky.GetAge() << " years old\n"; Frisky.Meow(); Frisky.SetAge(7); cout << "Now Frisky is " ; cout << Frisky.GetAge() << " years old\n"; return 0;}

Meow.Frisky is a cat who is 5 years old.Meow.Now Frisky is 7 years old.Bye bye

Page 12: C++  for the MFE class at UC Berkeley

12

Different Files

class Cat{public: Cat (int initialAge); int GetAge() { return itsAge;} // inline! void SetAge (int age) { itsAge = age;} // inline! void Meow();private: int itsAge;};

Cat class declaration in cat.h

#include <iostream.h>#include "cat.h" // be sure to include the header file!

Cat::Cat(int initialAge) { itsAge = initialAge;}

Cat::Meow() { cout << "Meow.\n";}

int main(){ Cat Frisky(5); Frisky.Meow(); cout << "Frisky is a cat who is " ; cout << Frisky.GetAge() << " years old.\n"; Frisky.Meow(); Frisky.SetAge(7); cout << "Now Frisky is " ; cout << Frisky.GetAge() << " years old.\n"; return 0;}

Cat implementation in cat.cpp

Page 13: C++  for the MFE class at UC Berkeley

13

1: #include <iostream.h>2:3: typedef unsigned short int USHORT;4: typedef unsigned long int ULONG;5: enum BOOL { FALSE, TRUE};6: enum CHOICE { DrawRect = 1, GetArea, 7: GetPerim, ChangeDimensions, Quit};8: // Rectangle class declaration9: class Rectangle10: {11: public:12: // constructors13: Rectangle(USHORT width, USHORT height);14: ~Rectangle();15:16: // accessors17: USHORT GetHeight() { return itsHeight; }18: USHORT GetWidth() { return itsWidth; }19: ULONG GetArea() { return itsHeight * itsWidth; }20: ULONG GetPerim() {return 2*itsHeight+2*itsWidth;}21: void SetSize(USHORT newW, USHORT newH);22:23: // Misc. methods24: void DrawShape() const;25:26: private:27: USHORT itsWidth;28: USHORT itsHeight;29: };

31: // Class method implementations32: void Rectangle::SetSize(USHORT newW,USHORT newH)33: {34: itsWidth = newW;35: itsHeight = newH;36: }37:38:39: Rectangle::Rectangle(USHORT width, USHORT height)40: {41: itsWidth = width;42: itsHeight = height;43: }44:45: Rectangle::~Rectangle() {}46:47: USHORT DoMenu();48: void DoDrawRect(Rectangle);49: void DoGetArea(Rectangle);50: void DoGetPerim(Rectangle);51:

Comprehensive Example

Page 14: C++  for the MFE class at UC Berkeley

14

52: void main ()53: {54: // initialize a rectangle to 10,2055: Rectangle theRect(30,5);56:57: USHORT choice = DrawRect;58: USHORT fQuit = FALSE;59:60: while (!fQuit)61: {62: choice = DoMenu();63: if (choice < DrawRect || choice > Quit)64: {65: cout << "\nInvalid Choice, please try again.\n\n";66: continue;67: }68: switch (choice)69: {70: case DrawRect:71: DoDrawRect(theRect);72: break;73: case GetArea:74: DoGetArea(theRect);75: break;76: case GetPerim:77: DoGetPerim(theRect);78: break;

79: case ChangeDimensions:80: USHORT newLength, newWidth;81: cout << "\nNew width: ";82: cin >> newWidth;83: cout << "New height: ";84: cin >> newLength;85: theRect.SetSize(newWidth, newLength);86: DoDrawRect(theRect);87: break;88: case Quit:89: fQuit = TRUE;90: cout << "\nExiting...\n\n";91: break;92: default:93: cout << "Error in choice!\n";94: fQuit = TRUE;95: break;96: } // end switch97: } // end while98: } // end main

Page 15: C++  for the MFE class at UC Berkeley

15

101: USHORT DoMenu()102: {103: USHORT choice;104: cout << "\n\n *** Menu *** \n";105: cout << "(1) Draw Rectangle\n";106: cout << "(2) Area\n";107: cout << "(3) Perimeter\n";108: cout << "(4) Resize\n";109: cout << "(5) Quit\n";111: cin >> choice;112: return choice;113: }114:115: void DoDrawRect(Rectangle theRect)116: {117: USHORT height = theRect.GetHeight();118: USHORT width = theRect.GetWidth();119:120: for (USHORT i = 0; i<height; i++)121: {122: for (USHORT j = 0; j< width; j++)123: cout << "*";124: cout << "\n";125: }126: }127:129: void DoGetArea(Rectangle theRect)130: {131: cout << "Area: " << theRect.GetArea() << endl;132: }133:134: void DoGetPerim(Rectangle theRect)135: {136: cout << "Perimeter: " << theRect.GetPerim() << endl;137: }

Page 16: C++  for the MFE class at UC Berkeley

16

Overloading functions

void myFunction (int, int);void myFunction (short, char);void myFunction (int);

The functions must differ in their parameter list:with a different type of parameter, a different number of parameters, or both.

void myFunction (int A, int B) { printf("First Func, A=%d. B=%d\n", A,B); }

void myFunction (short A, char B); { printf("Second Func, A=%d. B=%c\n", A,B); }

void myFunction (int A); { printf("Third Func, A=%d\n", A); }

void main(){ myFunction( 1, 2 ); myFunction( 5, 'T' ); myFunction( 12 );}First Func A=1, B=2Second Func A=5, B=TThird Func A=12

Page 17: C++  for the MFE class at UC Berkeley

17

Overloading constructors

class Cat {public: Cat(int initialAge); // constructor #1 Cat(); // constructor #2 int GetAge(); void SetAge(int age); void Meow();private: int itsAge;};

// constructor of Cat #1Cat::Cat(int initialAge){ itsAge = initialAge;}

// constructor of Cat #2Cat::Cat(){ itsAge = 0;}

int main(){ Cat Frisky(5); Cat Whisky();}

Page 18: C++  for the MFE class at UC Berkeley

18

Inheritance: derive one class from another

class Mammal{ public: Mammal(); ~Mammal(); int GetAge(); void SetAge(int); int GetWeight(); void SetWeight(); void Speak(); void Sleep(); protected: int itsAge; int itsWeight;};

enum BREED { SHETLAND, DOBERMAN, LAB };

class Dog : public Mammal{ public: Dog(); ~Dog(); BREED GetBreed() const; void SetBreed(BREED); protected: BREED itsBreed;};

void main(){ Dog fido; fido.SetAge(3); fido.SetBreed( SHETLAND ); cout << "Fido is " << fido.GetAge() << " years old\n";}

Page 19: C++  for the MFE class at UC Berkeley

19

Inheritance: Overriding Functionsclass Mammal{ public: // constructors Mammal() { cout << "Mammal constructor...\n"; } ~Mammal() { cout << "Mammal destructor...\n"; } void Speak() { cout << "Mammal sound!\n"; } void Sleep() { cout << "shhh. I'm sleeping.\n"; } protected: int itsAge; int itsWeight;};

class Dog : public Mammal{ public: Dog() { cout << "Dog constructor...\n"; } ~Dog() { cout << "Dog destructor...\n"; } void WagTail() { cout << "Tail wagging...\n"; } void BegForFood() { cout << "Begging for food...\n"; } void Speak() { cout << "Woof!\n"; } private: BREED itsBreed;};

int main(){ Mammal bigAnimal; Dog fido; bigAnimal.Sleep(); bigAnimal.Speak(); fido.Sleep(); fido.Speak(); return 0;}

Mammal constructor...Mammal constructor...Dog constructor...Shh. I’m sleeping.Mammal sound!Shh. I’m sleeping.Woof!Dog destructor...Mammal destructor...Mammal destructor...

Page 20: C++  for the MFE class at UC Berkeley

20

Pointer to a class

void PrintDogsAge( Dog * P ){ printf("The age of the ” “Dog is: %d \n", P->GetAge(); }

void main(){ Dog *pFido = new Dog; pFido->SetAge( 4 ); PrintDogsAge( pFido );

Dog *pMyDog; pMyDog = pFido; PrintDogsAge( pMyDog );

Dog Barky; Barky.SetAge(3);

pMyDog = &Barky; int I = pMyDog->GetAge();

pMyDog = pFido; I = pMyDog->GetAge(); int J = pFido->GetAge(); int K = Barky.GetAge();}Exercise: Write the output of this program

Page 21: C++  for the MFE class at UC Berkeley

21

Virtualclass Mammal{ public: Mammal():itsAge(1) { cout << "Mammal constructor...\n"; }

~Mammal() { cout << "Mammal destructor...\n"; }

void Move() { cout << "Mammal move one step\n"; }

virtual void Speak() { cout << "Mammal speak!\n"; }

protected: int itsAge;};

class Dog : public Mammal{ public: Dog() { cout << "Dog Constructor...\n"; }

~Dog() { cout << "Dog destructor...\n"; }

void WagTail() { cout << "Wagging Tail...\n"; }

void Speak() { cout << "Woof!\n"; }

void Move() { cout << "Dog moves 5 steps...\n"; }

};

int main(){ Mammal *pDog = new Dog; pDog->Move(); pDog->Speak();}

Mammal constructor...Dog Constructor...Mammal move one stepWoof!

Dog Fido; Fido.Move(); Fido.Speak();

Mammal constructor...Dog Constructor...Dog moves 5 stepsWoof!Dog destructorMammal destructor

Page 22: C++  for the MFE class at UC Berkeley

22

Virtual – Why do we need it?For example, you could create many different types of windows, including dialog boxes, scrollable windows, and list boxes, and give them each a virtual draw() method. By creating a pointer to a window and assigning dialog boxes and other derived types to that pointer, you can call draw() without regard to the actual run-time type of the object pointed to. The correct draw() function will be called.

Exercise: Write example of three classes: base class (CWindow), and two derivative classes (CListBox and CDialogBox) which implement the function draw differently. And a function that receives a pointer of the type CWindow, and calls the draw function.

Page 23: C++  for the MFE class at UC Berkeley

23

Static variablesclass Cat{ public: Cat(int age):itsAge(age) { HowManyCats++; } virtual ~Cat() { HowManyCats--; } virtual int GetAge() { return itsAge; } virtual void SetAge(int age) { itsAge = age; } static int HowManyCats; private: int itsAge;};

int Cat::HowManyCats = 0;void main(){ const int MaxCats = 5; int i; Cat *CatHouse[MaxCats]; for (i = 0; i<MaxCats; i++) CatHouse[i] = new Cat(i); for (i = 0; i<MaxCats; i++) { cout << "There are " << Cat::HowManyCats << " cats left!\n"; cout << "Deleting the one which is " << CatHouse[i]->GetAge() << " years old\n"; delete CatHouse[i]; CatHouse[i] = 0; }}

There are 5 cats left!Deleting the one which is 0 years oldThere are 4 cats left!Deleting the one which is 1 years oldThere are 3 cats left!Deleting the one which is 2 years oldThere are 2 cats left!Deleting the one which is 3 years oldThere are 1 cats left!Deleting the one which is 4 years old

Page 24: C++  for the MFE class at UC Berkeley

24

Static Function – simple…

class Cat{ public: … static int GetNumberOfCats() { return HowManyCats; } static int HowManyCats; private: int itsAge;};

int Cat::HowManyCats = 4;void main(){ int I = Cat::GetNumberOfCats();}

Page 25: C++  for the MFE class at UC Berkeley

25

Static Function – very complicated…class CBuf {public: int A; void CloseCompresBuf(); static void StaticCloseCompresBuf( void *B ) { ((CBuf *)B)->CloseCompresBuf(); }};

void CBuf::CloseCompressedBuf(){ printf("A = %d\n", A );}

typedef *FUNC(void *);FUNC *gFunc;void *gParam;

void Set_Timer_Timeout ( FUNC Func, void *Param ){ gFunc = Func; gParam = Param;}

void Timer_timeout(){ gFunc( gParam );}

void main(){ CBuf *Buf1 = new CBuf; Buf1->A = 11; Set_Timer_Timeout( (FUNC *) CBuf::StaticCloseCompresBuf, Buf1 ); Timer_timeout(); // emulate interrupt}

Page 26: C++  for the MFE class at UC Berkeley

26

Next week:

• More examples

• MFC classes – CString etc…

• Writing Windows application using CDialog

Exercise / Homework:This was the basic foundation of C++Spending ONLY 2.5 hours in class is NOT enough to master the foundation…The easiest way to memorize it and get more familiar with it is to – surprisingly simple -

COPY all the samples and run them one by one on your PC.

And based on this foundation…