Object-Oriented Programming in C++ Lecture 2 Classes and Objects Introduction Last lecture we • introduced the module • introduced C++ This lecture we will • review the concept of classes and objects • discuss their representation using UML class diagrams • implement and use a simple C++ class • introduce C++ structures and enumeration types Classes and objects • a class is a programmer-created data type • it can have member variables (attributes) – to hold data • and member functions (methods) – to manipulate that data • an object is an instance of a class – with specific values for the member variables • normally the member variables are private – hidden within the object • we interact with the object via its public methods • encapsulation Example – Account class • consider a class to represent a bank account • what data do we need to store about a bank account? – account balance – interest rate • what functions are needed to manipulate this data? – get the balance, deposit money, withdraw money, calculate and add the interest – create an account with a given initial balance and interest rate • each bank account object will have its own balance – and interest rate in this example UML class diagrams • UML (the Unified Modelling language) defines 13 standard diagrams for system modelling • the class diagram is a useful way to represent a class – its member variables and methods – their type and visibility • UML diagrams can have different levels of detail – from initial ideas (analysis) to implementationlevel documentation UML diagram of an Account Account balance interest rate create account get balance deposit money withdraw money add interest • the diagram has 3 sections • the class name is at the top • the variables are in the middle • the functions are at the bottom • this is an analysis-level diagram • what should the implementation-level diagram look like? Implementation-level diagram of an Account Account -balance: double -interestRate: double +Account(initalBalance: double, rate: double) +getBalance() : double +deposit(amount: double) +withdraw(amount: double) +addInterest() • the member visibility is shown by: - private + public # protected • the type of each member is shown after the member name C++ implementation of the Account class class Account { private: // optional because members are private by default double balance; // amount of money held by this account double interestRate; // a monthly or yearly interest rate public: // create an account with an initial amount and a specified interest rate Account(double initialBalance, double rate) : balance(initialBalance), interestRate(rate){ } // return the account's balance double getBalance(){ return balance;} // add money to the account void deposit(double amount) { balance += amount; } // continued on next slide C++ implementation of the Account class void withdraw(double amount) { // implement this method yourself } // add money according to the interest rate. void addInterest() { balance *= (1 + interestRate/100.0); // this is the same as balance = balance * (1 + (interestRate/100) ); } }; Using the Account class • create a project • put the Account class code into a header file called account.h – this is the account class definition • create a source file called bank.cpp – this will contain the main method – which will create and test an Account object bank.cpp #include <iostream> #include "account.h" using namespace std; void main(void) { Account stdAccount(100, 4); // create an account with £100and 4% interest rate stdAccount.addInterest(); cout << "Balance: " << stdAccount.getBalance()<< endl; stdAccount.deposit(50); cout << "Balance: " << stdAccount.getBalance()<< endl; stdAccount.withdraw(100); cout << "Balance: " << stdAccount.getBalance()<< endl; } #include directives #include <iostream> #include "account.h" • iostream is a library file – the angled brackets indicate the file is in the C++ library directory – path should already been set up in IDE • account.h was written by the programmer • the quotes indicate the file path and name • in this case, it is in the same directory as bank.cpp Constructors • the constructor is called when an object is first created – sets up the object in memory – with space for the member variables • if the class does not have a constructor, a default no-argument constructor is used • a constructor must have the same name as the class – and no return value Account constructor • the constructor initialises the member variables balance and interestRate Account(double initialBalance, double rate) : balance(initialBalance),interestRate(rate) { } • this is equivalent to the Java-like constructor Account(double initialBalance, double rate) { balance = initialBalance; interestRate = rate; } • the first version initialises the member variables as they are created • the second creates the member variables – then assigns them values within the constructor body – less efficient Destructors • a destructor is called when the object is destroyed – goes out of scope or is deleted • a destructor has the same name as the class, preceded by a ~ – it cannot have any parameters or return value – it is called automatically – never call it yourself – a destructor for the Account class: ~Account() { cout << "Closing the account. Final balance: " << balance << endl; } C++ structures • C++ structures are similar to classes – they can have member variables and functions – however all members are public by default • no encapsulation – an Account struct could have its balance changed directly – rather through the deposit and withdraw methods • structs are useful to group together related data Example structures struct Point3D { float x; float y; float z; }; int main() { Point3D A = { 10, 5.3, 6}; Point3D B; B.x = 2.1; B.y = 2.4; B.z = 7.3; //.... } Enumeration types • another useful programmer-defined type is the enumeration • defines all possible values of a given type enum colour { RED,ORANGE,YELLOW,GREEN,BLUE,VIOLET }; int main() { colour hatColour = ORANGE; colour shirtColour = VIOLET; // .... } • each enum value maps to an integer • RED is 0, ORANGE is 1…. • less error-prone than using strings or constants Summary In this lecture we have • reviewed the concept of classes • discussed their representation using UML class diagrams • implemented and used a simple C++ class • introduced C++ structures and enumeration types In the tutorial we will • implement the Account class • add more functionality and a menu-driven interface Further reading • Object Management Group – UML Resource Page http://www.uml.org/ • MSDN library – C++ language reference – Classes, structures and unions http://msdn.microsoft.com/en-us/library/4a1hcx0y.aspx