260 likes | 427 Views
C++ for the MFE class at UC Berkeley. Yuli Kaplunovsky MFE, MBA, MS-Tax, CFA yuli@FinancialSimulations.com (408) 884 5965. Introduction. Based upon “Teach Yourself C++ in 21 Days” http://cma.zdnet.com/book/c++/
E N D
C++ for the MFE class at UC Berkeley Yuli Kaplunovsky MFE, MBA, MS-Tax, CFA yuli@FinancialSimulations.com (408) 884 5965
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
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!
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; }
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
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
Sample program #2 1: // Demonstrates declaration of a class and 2: // definition of an object of the class, 3: 4: #include <iostream.h> // for cout 5: 6: class Cat // declare the class object 7: { 8: public: // members which follow are public 9: int itsAge; 10: int itsWeight; 11: }; 12: 13: 14: void main() 15: { 16: Cat Frisky; 17: Frisky.itsAge = 5; // assign to the member variable 18: 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.
Implementing Class Methods void Cat::Meow() { cout << "Meow.\n"; } Calling class function void main() { Cat Frisky; Frisky.Meow(); }
Using internal variables inside class 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"; } 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 Meow Whisky says: Meow Meow Meow Meow Meow
Public / Private void Cat::HappyBirthday() { itsAge++; } class 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.
constructors and destructors class Cat { public: Cat(int initialAge); // constructor ~Cat(); // destructor int GetAge(); void SetAge(int age); void Meow(); private: int itsAge; }; 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 // constructor of Cat Cat::Cat(int initialAge) { itsAge = initialAge; } Cat::~Cat() // destructor { cout << “Bye bye \n"; }
Different Files Cat implementation in cat.cpp #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 class declaration in cat.h class Cat { public: Cat (int initialAge); int GetAge() { return itsAge;} // inline! void SetAge (int age) { itsAge = age;} // inline! void Meow(); private: int itsAge; };
Comprehensive Example 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 declaration 9: class Rectangle 10: { 11: public: 12: // constructors 13: Rectangle(USHORT width, USHORT height); 14: ~Rectangle(); 15: 16: // accessors 17: 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. methods 24: void DrawShape() const; 25: 26: private: 27: USHORT itsWidth; 28: USHORT itsHeight; 29: }; 31: // Class method implementations 32: 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:
52: void main () 53: { 54: // initialize a rectangle to 10,20 55: 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 switch 97: } // end while 98: } // end main
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: }
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=2 Second Func A=5, B=T Third Func A=12
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 #1 Cat::Cat(int initialAge) { itsAge = initialAge; } // constructor of Cat #2 Cat::Cat() { itsAge = 0; } int main() { Cat Frisky(5); Cat Whisky(); }
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"; }
Inheritance: Overriding Functions class 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; }; 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... 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; };
Pointer to a class 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(); } void PrintDogsAge( Dog * P ) { printf("The age of the ” “Dog is: %d \n", P->GetAge(); } Exercise: Write the output of this program
Virtual class 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; }; int main() { Mammal *pDog = new Dog; pDog->Move(); pDog->Speak(); } Mammal constructor... Dog Constructor... Mammal move one step Woof! 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"; } }; Dog Fido; Fido.Move(); Fido.Speak(); Mammal constructor... Dog Constructor... Dog moves 5 steps Woof! Dog destructor Mammal destructor
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.
Static variables class 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; }; There are 5 cats left! Deleting the one which is 0 years old There are 4 cats left! Deleting the one which is 1 years old There are 3 cats left! Deleting the one which is 2 years old There are 2 cats left! Deleting the one which is 3 years old There are 1 cats left! Deleting the one which is 4 years old 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; } }
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(); }
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 }
Next week: 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… • More examples • MFC classes – CString etc… • Writing Windows application using CDialog