6.088-2 .The logistics of memory manipulation in C

Add to Favourites
Post to:

6.088 Intro to C/C++Day 4: Object-oriented programming in C++Eunsuk Kang and JeanYangToday’s topics Why objects? Object-oriented programming (OOP) in C++�classes �fields & methods �objects �representation invariant 2Why objects?At the end of the day... computers just manipulate 0’s and 1’sImage of zeroes and ones.Figure by MIT OpenCourseWare.But binary is hard (for humans) to work with5Towards a higher level of abstractionbinary code assembly languages procedural languages (C, Fortran, COBOL...) OO languages (C++, Java, Python...) declarative languages (Haskell, ML, Prolog...) ? 6Image with a circuit board at the bottom, an arrow pointing upward, and brain top.Figure by MIT OpenCourseWare.There are always trade-offsHigh-level languages �simpler to write & understand �more library support, data structures Low-level languages �closer to hardware �more efficient (but also dangerous!) What about C++? 7What are objects? Objects model elements of the problem context Each object has: �characteristics �responsibilities (or required behaviors) 8Example Problem Design and build a computer hockey game Object Hockey player Characteristics Position, height, weight, salary, number of goalsResponsibilities Pass the puck, shoot, skate forward,skate backward, punch another player, etc.9Another example Problem Computation modeling in biology Write a program that simulates the growth of virus population in humans over time. Each virus cell reproduces itself at some time interval. Patients may undergo drug treatment to inhibit the reproduction process, and clear the virus cells from their body. However, some of the cells are resistant to drugs and may survive. 10Write a program that simulates the growth of virus population in humans over time. Each virus cell reproduces itself at some time interval. Patients may undergo drug treatment to inhibit the reproduction process, and clear the virus cells from their body. However, some of the cells are resistant to drugs and may survive. What are objects? Characteristics? Responsibilities? 11Write a program that simulates the growth of virus population in humans over time. Each virus cell reproduces itself at some time interval. Patients may undergo drug treatment to inhibit the reproduction process, and clear the virus cells from their body. However, some of the cells are resistant to drugs and may survive. What are objects? Characteristics? Responsibilities? 12Patient characteristics �virus population �immunity to virus (%)responsibilities �take drugs Virus characteristics �reproduction rate (%)�resistance (%) responsibilities �reproduce �survive 13Questions Why didn’t we model an object named Doctor? Surely, most hospitals have doctors, right? 14Questions Why didn’t we model an object named Doctor? Surely, most hospitals have doctors, right? Doesn’t every patient have an age? Gender? Illness? Symptoms? Why didn’t we model them as characteristics? 15Basic OOP in C++Classes A class is like a cookie cutter; it defines the shape of objects Objects are like cookies; they are instances of the class 17 Photograph courtesy of Guillaume Brialon on Flickr.Classes: Declaration vs. definitionclient depends declaration implements definition Declaration (.h files) �list of functions & fields �including functions that the class promises to its client�it’s like a “contract” Definition (.cc files) �implementation of functions 18 Class declarationClass declaration class Virus { float reproductionRate; //rate of reproduction, in % float resistance; //resistance against drugs, in % static const float defaultReproductionRate = 0.1; public: Virus(float newResistance);Virus(float newReproductionRate, float newResistance);Virus* reproduce(float immunity);bool survive(float immunity);}; 20class name fieldclass Virus { float reproductionRate; //rate of reproduction, in % float resistance; //resistance against drugs, in % static const float defaultReproductionRate = 0.1; public: Virus(float newResistance);Virus* reproduce(float immunity);bool survive(float immunity); Virus(float newReproductionRate, float newResistance); constructors }; method don’t forget the semi-colon! 21 Fields (characteristics) class Virus { float reproductionRate; //rate of reproduction, in % float resistance; //resistance against drugs, in % static const float defaultReproductionRate = 0.1; public: Virus(float newResistance);Virus(float newReproductionRate, float newResistance);Virus* reproduce(float immunity);bool survive(float immunity);}; 22Methods (responsibilities)class Virus { float reproductionRate; //rate of reproduction, in % float resistance; //resistance against drugs, in % static const float defaultReproductionRate = 0.1; public: Virus(float newResistance);Virus(float newReproductionRate, float newResistance);Virus* reproduce(float immunity);bool survive(float immunity);}; 23Constructorsclass Virus { float reproductionRate; //rate of reproduction, in % float resistance; //resistance against drugs, in % static const float defaultReproductionRate = 0.1; public: Virus(float newResistance);Virus(float newReproductionRate, float newResistance);Virus* reproduce(float immunity);bool survive(float immunity);}; Note the special syntax for constructor (no return type!)24 Access control: public vs. private class Virus { Virus(float newResistance);Virus(float newReproductionRate, float newResistance); publicVirus* reproduce(float immunity);bool survive(float immunity);float reproductionRate; //rate of reproduction, in %//resistance against drugs, in %float resistance; privatestatic const float defaultReproductionRate = 0.1; public:}; private: can only be accessed inside the class public: accessible by anyone 25 Client Interface How do we decide private vs. public?depends satisfies Implementation interface: parts of class that change infrequently (e.g. virus must be able to reproduce) implementation: parts that may change frequently(e.g. representation of resistance inside virus) 26Protect your private parts!Client Interface Implementation XWhy is this bad? 27Access control: public vs. private class Virus { Virus(float newResistance);Virus(float newReproductionRate, float newResistance); publicVirus* reproduce(float immunity);bool survive(float immunity);float reproductionRate; //rate of reproduction, in %//resistance against drugs, in %float resistance; privatestatic const float defaultReproductionRate = 0.1; public:}; In general, �keep member fields as private �minimize the amount of public parts28 Access control: constant fields class Virus { float reproductionRate; //rate of reproduction, in % float resistance; //resistance against drugs, in % static const float defaultReproductionRate = 0.1; public: Virus(float newResistance);Virus(float newReproductionRate, float newResistance);Virus* reproduce(float immunity);bool survive(float immunity);}; Why make it a constant? Why not just declare it as a normal field? 29 Class definitionClass definition # #include “Virus.h” Virus::Virus(float newResistance) { reproductionRate = defaultReproductionRate; resistance = newResistance; } Virus::Virus(float newReproductionRate, float newResistance) { reproductionRate = newReproductionRate; resistance = newResistance; }//If this virus cell reproduces, //returns a new offspring with identical genetic info.//Otherwise, returns NULL.Virus* Virus::reproduce(float immunity) { float prob = (float) rand() /RAND_MAX; //generate number between 0 and 1 //If the patient's immunity is too strong, it cannot reproduce if (immunity > prob) return NULL; //Does the virus reproduce this time? if (prob > reproductionRate) return NULL; //No! return new Virus(reproductionRate, resistance); } //Returns true if this virus cell survives, given the patient's immunity bool Virus::survive(float immunity) { //If the patient's immunity is too strong, then this cell cannot survive if (immunity > resistance) return false; return true; } const float Virus::defaultReproductionRate; 31 Header inclusion #include #include "Virus.h" Virus::Virus(float newResistance) { reproductionRate = defaultReproductionRate; resistance = newResistance; } Virus::Virus(float newReproductionRate, float newResistance) { reproductionRate = newReproductionRate; resistance = newResistance; } 32Constructor definition #include #include "Virus.h" Virus::Virus(float newResistance) { reproductionRate = defaultReproductionRate; resistance = newResistance; } Virus::Virus(float newReproductionRate, float newResistance) { reproductionRate = newReproductionRate; resistance = newResistance; } Remember to initialize all fields inside constructors!33 Constructor definition Can also do: Virus::Virus(float newReproductionRate, float newResistance) { reproductionRate = newReproductionRate; resistance = newResistance; } Virus::Virus(float newReproductionRate, float newResistance) : reproductionRate(newReproductionRate), resistance(newResistance){}34Method definition //Returns true if this virus cell survives, //given the patient's immunity bool Virus::survive(float immunity) { //If the patient's immunity is too strong, //then this cell cannot survive if (immunity > resistance)return false; return true; } 35Working with objectsPatient class declaration #include “Virus.h” #define MAX_VIRUS_POP 1000 class Patient { Virus* virusPop[MAX_VIRUS_POP];int numVirusCells;float immunity; //degree of immunity, in % public: Patient(float initImmunity, int initNumViruses); ~Patient(); void takeDrug(); bool simulateStep(); }; 37Patient class declaration #include “Virus.h” #define MAX_VIRUS_POP 1000 Array of pointers to objectsclass Patient { Virus* virusPop[MAX_VIRUS_POP];int numVirusCells;float immunity; //degree of immunity, in %Constructor public: Patient(float initImmunity, int initNumViruses); ~Patient(); void takeDrug();bool simulateStep();};Destructor38Static object allocation class Patient { ... public: Patient(float initImmunity, int initNumViruses); ... }; int main() { float initImmunity = 0.1;int initNumVirusCells = 5; Patient p(0.1, 5); p.takeDrug(); } 39Calling the constructor class Patient { ... public:... }; int main() { p.takeDrug(); } float initImmunity = 0.1; int initNumVirusCells = 5; Patient(float initImmunity, int initNumViruses); Patient p(0.1, 5); 40Deleting statically allocated objectsclass Patient { ... public: Patient(float initImmunity, int initNumViruses); ... }; int main() { float initImmunity = 0.1;int initNumVirusCells = 5; Patient p(0.1, 5); p.takeDrug(); } Automatically destroyed at the end of scope 41 Objects on heap To allocate an object on heap: �use “new” keyword (analogous to “malloc”)To deallocate: �use “delete” keyword (analogous to “free”)Patient* p = new Patient(0.1, 5);...delete p;42Dynamic object creation: ExamplePatient::Patient(float initImmunity, int initNumVirusCells) { float resistance; immunity = initImmunity; for (int i = 0; i < initNumVirusCells; i++) { //randomly generate resistance, between 0.0 and 1.0 resistance = (float) rand()/RAND_MAX; virusPop[i] = new Virus(resistance); } numVirusCells = initNumVirusCells; } 43Using dynamically allocated objectsbool Patient::simulateStep() { Virus* virus; bool survived = false; ... for (int i = 0; i < numVirusCells; i++){ virus = virusPop[i]; survived = virus->survive(immunity); if (survived) { ... } else { ... } ... } 44What happens during destruction?The destructor is automatically called Patient::~Patient(){ for (int i = 0; i < numVirusCells; i++){ delete virusPop[i]; } } Patient* p = new Patient(0.1, 5);...delete p;But why didn’t we have a destructor forVirus?45 Representation invariant Representation invariant Statements about characteristics of objects �defines what it means for an object to be valid �e.g.“Every IKEA coffee table must have four legs”Valid Invalid47A valid table with four legs, and an invalid three legs.Figures by MIT OpenCourseWare.Exampleclass Patient { Virus* virusPop[MAX_VIRUS_POP];int numVirusCells;float immunity; //degree of immunity, in % public: Patient(float initImmunity, int initNumViruses);~Patient();void takeDrug();bool simulateStep();}; What are the representation invariants for Patient?48 Rep. invariant violationvoid Patient::takeDrug(){ immunity = immunity + 0.1; } What’s wrong with this method?49Preserving rep. invariantbool Patient::checkRep() { return (immunity >= 0.0) && (immunity < 1.0) && (numVirusCells >= 0) && (numVirusCells < MAX_VIRUS_POP); } checkRep �returns true if and only if the rep. invariants hold true�call checkRep at the beginning and end of every public method �call checkRep at the end of constructors 50Preserving rep. invariant#include class Patient { ... bool checkRep(); public: ... }; void Patient::takeDrug() { assert(checkRep()); ... assert(checkRep()); } Patient::Patient(float initImmunity, int initNumViruses) { ... assert(checkRep()); } 51 Preserving rep. invariant Will calling checkRep() slow down my program? Yes, but you can take them out once you are confident about your code. 52Until next time... Homework #4 (due 11:59 PM Monday)�implementing BSTs using classes Next lecture �inheritance & polymorphism �templates 53References Thinking in C++ (B. Eckel) Free online edition!Essential C++ (S. Lippman)Effective C++ (S. Meyers)C++ Programming Language (B. Stroustrup)Design Patterns (Gamma, Helm, Johnson,Vlissides)Object-Oriented Analysis and Design with Applications (G. Booch, et. al)54 MIT OpenCourseWarehttp://ocw.mit.edu 6.088 Introduction to C Memory Management and C++ Object-Oriented Programming January IAP 2010 For information about citing these materials or our Terms of Use, visit: http://ocw.mit.edu/terms.

Description
In this lecture notes we discuss about What memory abstractions does C provide?, What exactly is the distinction between stack and heap?, How to use pointers to access memory locations? , How to I allocate and free memory on the heap? , and How we can use GDB and Valgrind?

“Eunsuk Kang & Jean Yang, 6.088-2 .The logistics of memory manipulation in C (pointers, structs), 6.088 Introduction to C Memory Management and C++ Object-Oriented Programming, Electrical Engineering and Computer Science, Engineering, Massachusetts Institute of Technology: MIT Open Course Ware,http://ocw.mit.edu (21-08-2011).License: Creative Commons BY-NC-SA: http://ocw.mit.edu/terms/#cc".

Comments

Want to learn?

Sign up and browse through relevant courses.

Name:
Your Email:
Password:
Country:
Contact no:


Area code Number
Subjects you are interested in:
Word verification: (Enter the text as in image)


Sign Up Already a member? Sign In
I agree to WizIQ's User Agreement & Privacy Policy
LearnOnline Through OCW
OpenCourseWare
User
102 Followers

Your Facebook Friends on WizIQ

Explore Similar Courses

Program in C++

Price:$149

Give live classes, create & sell online courses

Try it free Plans & Pricing

Connect