10 Introduction to Classes 611 18200 計算機程式語言 Lecture 10-1 國立臺灣大學生物機電系 Contents • Abstract data types in C++ (Classes) • Constructors • A case study involving constructing a room object • Object identification and the Unified Modeling Language (UML) • Common programming errors 611 18200 計算機程式語言 Lecture 10-2 國立臺灣大學生物機電系 Abstract Data Types in C++ (Classes) • Procedural, hybrid, and pure object-oriented languages – Pure object-oriented language: Smalltalk, Eiffel – C++ is an object-oriented hybrid language. • An object oriented approach fits graphically windowed environments • Abstract data types: Central to creation of objects; a user defined data type rather than a built-in data type 611 18200 計算機程式語言 Lecture 10-3 國立臺灣大學生物機電系 Abstract Data Types • Data type: Combination of data and associated operations • A data type defines both the types of data and the types of operations that can be performed on the data – Data type = Allowable Data Values + Operational Capabilities 611 18200 計算機程式語言 Lecture 10-4 國立臺灣大學生物機電系 Abstract Data Types • Abstract data type (ADT): User defined type that specifies both a type of data and the operations that can be performed on it – User defined types are required when you want to create objects that are more complex than simple integers and characters • Data structure: How data is stored • Class: C++ name for an abstract data type 611 18200 計算機程式語言 Lecture 10-5 國立臺灣大學生物機電系 Class Construction • Two components: – Declaration section: Declares data types and function for class – Implementation section: Defines functions whose prototypes were declared in declaration section • Class members: – Data members (instance variables) – Member functions 611 18200 計算機程式語言 Lecture 10-6 國立臺灣大學生物機電系 Class Construction // class declaration section class classname { data members // the variables function members // prototypes }; // class implementation section function definitions 611 18200 計算機程式語言 Lecture 10-7 國立臺灣大學生物機電系 Class Construction • Example of class declaration section: class Date { private: int month; int day; int year; public: Date(int = 7, int = 4, int = 2006); void setDate(int, int, int); void showDate(void); }; // this is a declaration – // don't forget the semicolon 611 18200 計算機程式語言 Lecture 10-8 國立臺灣大學生物機電系 Class Construction • Declaration section of class definition – Enclosed in braces – Includes variables (data members) and function declarations – Keywords private and public: Define access rights • private: Class members (month, day, and year) can only be accessed using class functions – Enforces data security (data hiding) • public: class members (functions Date(), setDate(), showDate() can be used outside of the class 611 18200 計算機程式語言 Lecture 10-9 國立臺灣大學生物機電系 Class Construction • Constructor function: Initializes class data members with values – Constructor function (Date()) has same name as the class – Default values for constructor are 7, 4, 2006 – Constructor function has no return type (a requirement for this special function) • Two remaining member functions: setDate() and showDate() declared as returning no value (void) 611 18200 計算機程式語言 Lecture 10-10 國立臺灣大學生物機電系 Class Construction • Implementation section of class definition – Functions: Defined same as other C++ functions but also includes scope resolution operator • To identify function as member of class – Implementation and declaration sections declare a class • Variables of the class (objects) must still be defined 611 18200 計算機程式語言 Lecture 10-11 國立臺灣大學生物機電系 Class Construction Example: Creation of objects of Date class in main() function of Program 10.1 int main() { Date a, b, c(4,1,2000); // declare 3 objects b.setDate(12,25,2006); // assign values to b's // data members cout << endl; a.showDate(); // display object a's values b.showDate(); // display object b's values c.showDate(); // display object c's values cout << endl; return 0; } 611 18200 計算機程式語言 Lecture 10-12 國立臺灣大學生物機電系 Class Construction • Description of main(): – Three objects of class Date defined – Constructor function: Date(), automatically called • Memory allocated for each object • Data members of the objects initialized – Object a: No parameters assigned therefore defaults are used: a.month = 7 a.day = 4 a.year = 2005 611 18200 計算機程式語言 Lecture 10-13 國立臺灣大學生物機電系 Class Construction • Description of main(): (continued) – Notation to create objects: objectName.attributeName – Object b: No parameters assigned, same defaults used – Object c: Defined with arguments 4, 1, and 1998 • Three arguments passed into constructor function resulting in initialization of c’s data members as: c.month = 4 c.day = 1 c.year = 2000 611 18200 計算機程式語言 Lecture 10-14 國立臺灣大學生物機電系 Class Construction • Description of main(): continued – All function of class Date are public, therefore • b.setDate(12, 25, 2006) is a valid statement inside main() function • Calls setDate() function with arguments 12 ,25, 2006 – Important distinction: Data members of class Date are private • The statement b.month = 12 is invalid in main() 611 18200 計算機程式語言 Lecture 10-15 國立臺灣大學生物機電系 Class Construction • Description of main(): continued – Last three statements in main() call showDate() to operate on a, b, and c objects • Calls result in output displayed by Program 10.1 The date is 07/04/06 The date is 12/25/07 The date is 04/01/98 – The statement cout << a; is invalid within main() • cout does not know how to handle an object of class Date 611 18200 計算機程式語言 Lecture 10-16 國立臺灣大學生物機電系 Class Construction Program 10.1 #include <iostream> #include <iomanip> using namespace std; // class declaration class Date { private: int month; int day; int year; public: Date(int = 7, int = 4, int = 2005); // constructor void setDate(int, int, int); // member function to copy a date void showDate(); // member function to display a date }; 611 18200 計算機程式語言 Lecture 10-17 國立臺灣大學生物機電系 Class Construction Program 10.1 (Continued) // implementation section Date::Date(int mm, int dd, int yyyy) { month = mm; day = dd; year = yyyy; } void Date::setDate(int mm, int dd, int yyyy) { month = mm; day = dd; year = yyyy; return; } 611 18200 計算機程式語言 Lecture 10-18 國立臺灣大學生物機電系 Class Construction Program 10.1 (Continued) void Date::showDate() { cout << "The date is "; cout << setfill('0') << setw(2) << month << '/' << setw(2) << day << '/' << setw(2) << year % 100; // extract last 2 year digits cout << endl; return; } 611 18200 計算機程式語言 Lecture 10-19 國立臺灣大學生物機電系 Class Construction Program 10.1 (Continued) int main() { Date a, b, c(4,1,2000); // declare 3 objects b.setDate(12,25,2006); a.showDate(); b.showDate(); c.showDate(); // // // // assign values to b's data members display object a's values display object b's values display object c's values cout << endl; return 0; } 611 18200 計算機程式語言 Lecture 10-20 國立臺灣大學生物機電系 Terminology • Class: Programmer-defined data type • Objects (instances): Created from classes – Relation of objects to classes similar to relation of variables to C++ built-in data types • int a; • Date a; // a is a variable of type integer // a is an object of class Date – Instantiation: Process of creating a new object • Creates new set of data members belonging to new object: Determines the object’s state 611 18200 計算機程式語言 Lecture 10-21 國立臺灣大學生物機電系 Terminology • Interface: Part of class declaration section – Includes: • Class’s public member function declarations • Supporting comments • Implementation: Consists of: – Implementation section of class definition • Private member functions • Public member functions – Private data members from class declaration section 611 18200 計算機程式語言 Lecture 10-22 國立臺灣大學生物機電系 Terminology • Information hiding: – Internal construction of class is not relevant to programmer who just wishes to use class – Implementation can and should be hidden from all users • Ensures that class is not altered or compromised in any way – Information needed by programmer to use class is provided by interface 611 18200 計算機程式語言 Lecture 10-23 國立臺灣大學生物機電系 Constructors • A function that has same name as its class – Multiple constructors can be defined for a class • Each must be distinguishable by the number and types of its parameters • This is an example of function overloading – If no constructor function is written, compiler assigns default constructor • Purpose: Initialize a new object’s data members – May perform other tasks 611 18200 計算機程式語言 Lecture 10-24 國立臺灣大學生物機電系 Constructors • Format: Same name as class to which it belongs – Must have no return type (not even void) • Default constructor: Does not require arguments when called – Two cases: • No parameters declared – As with compiler-supplied default constructor • Arguments have already been given default values in valid prototype statement: – Date (int = 7, int = 4, int = 2005) – Declaration Date a; initializes the a object with default values: 7, 4, 2006 611 18200 計算機程式語言 Lecture 10-25 國立臺灣大學生物機電系 Constructors • Sample class declaration: class Date { private: int month, day, year; public: void setDate(int, int, int); void showDate() }; 611 18200 計算機程式語言 Lecture 10-26 國立臺灣大學生物機電系 Constructors • No constructor has been included – Compiler assigns a do-nothing default constructor equivalent to: Date (void) { } • This constructor expects no parameters, and has an empty body 611 18200 計算機程式語言 Lecture 10-27 國立臺灣大學生物機電系 Constructors Constructor Format classname::classname(parameter list) { // function body } 611 18200 計算機程式語言 Lecture 10-28 國立臺灣大學生物機電系 Constructors Use of constructor in main() - Program 10.2 int main() { Date a; Date b; Date c (4,1,2006); return 0; } 611 18200 計算機程式語言 Lecture 10-29 // declare an object // declare an object // declare an object 國立臺灣大學生物機電系 Constructors Program 10.2 #include <iostream> using namespace std; // class declaration section class Date { private: int month; int day; int year; public: Date(int = 7, int = 4, int = 2005); }; 611 18200 計算機程式語言 Lecture 10-30 // constructor 國立臺灣大學生物機電系 Constructors Program 10.2 (Continued) // implementation section Date::Date(int mm, int dd, int yyyyy) { month = mm; day = dd; year = yyyyy; cout << "Created a new data object with data values " << month << ", " << day << ", " << year << endl; } int main() { Date a; // declare an ojbect Date b; // declare an object Date c(4,1,2006); // declare an object return 0; } 611 18200 計算機程式語言 Lecture 10-31 國立臺灣大學生物機電系 Constructors Output from Program 10.2 Created a new data object with data values 7, 4, 2005 Created a new data object with data values 7, 4, 2005 Created a new data object with data values 4, 1, 2006 611 18200 計算機程式語言 Lecture 10-32 國立臺灣大學生物機電系 Calling Constructors • Constructors are called when an object is created • Declaration can be made in a variety of ways – Date c(4,1,2006); – Date c = Date(4,1,2006); – Date c = 8; • An object should never be declared with empty parentheses – Date a(); • Not the same as the declaration Date a; • Does not result in an object being created 611 18200 計算機程式語言 Lecture 10-33 國立臺灣大學生物機電系 Overloaded and Inline Constructors • Primary difference between a constructor and other user-written functions is how the constructor is called – Constructors are called automatically each time an object is created – Most other functions must be called explicitly by name • Inline functions are functions defined in the class declaration section 611 18200 計算機程式語言 Lecture 10-34 國立臺灣大學生物機電系 Destructors • Destructor functions: Counterpart to the constructor functions • Destructors: – Are functions with the same name as constructors but are preceded with a tilde (~) • For the Date class the destructor name is ~Date() – Take no parameters and return no values • There can only be one destructor per class 611 18200 計算機程式語言 Lecture 10-35 國立臺灣大學生物機電系 Destructors • Destructors: – Called automatically when an object goes out of existence – Clean up any undesirable effects the object might leave, such as releasing memory stored in a pointer 611 18200 計算機程式語言 Lecture 10-36 國立臺灣大學生物機電系 A Case Study: Constructing a Room Object • Applying your knowledge of classes: Create a class from which room objects can be created • Room’s floor area must be calculated for any size room when its length and width are known – For modeling purposes, assume every room is rectangular 611 18200 計算機程式語言 Lecture 10-37 國立臺灣大學生物機電系 A Case Study: Constructing a Room Object • Coding the solution class RoomType { // data declaration section private: double length; // declare length as a double variable double width; // declare width as a double variable public: RoomType(double = 0.0, double = 0.0); // the constructor's declaration // statement void showRoomValues(); void setNewRoomValues(double, double); void calculateRoomArea(); }; 611 18200 計算機程式語言 Lecture 10-38 國立臺灣大學生物機電系 A Case Study: Constructing a Room Object RoomType::RoomType(double l, double w) // this is a constructor { length = l; width = w; cout << "Created a new room object using the default constructor.\n\n"; } void RoomType::showRoomValues() // this is an accessor { cout << " length = " << length << "\n width = " << width << endl; } void RoomType::setNewRoomValues(double l, double w) { length = l; width = w; } void RoomType::calculateRoomArea() { cout << (length * width); } 611 18200 計算機程式語言 Lecture 10-39 // this is a mutator // this performs a calculation 國立臺灣大學生物機電系 A Closer Look: Object Identification and the Unified Modeling Language (UML) • When solving any problem, it is often helpful to start by creating a diagram or map or devising a theoretical analogy for the problem you are trying to solve • The first step in constructing an object-based program is developing an object-based model of the program 611 18200 計算機程式語言 Lecture 10-40 國立臺灣大學生物機電系 A Closer Look: Object Identification and the Unified Modeling Language (UML) Figure 10.1 A class is a programming-language description of a model 611 18200 計算機程式語言 Lecture 10-41 國立臺灣大學生物機電系 Representing Problems with Models • A model is a representation of a problem • First step in creating an object-based model is to begin “thinking in objects” • Objects can be modeled by two basic characteristics – Attributes define the properties of interest – Behaviors define how the object reacts to its environment 611 18200 計算機程式語言 Lecture 10-42 國立臺灣大學生物機電系 Representing Problems with Models • Two steps to designing and developing an object-oriented program – Identify the required objects – For each object • Identify the attributes of interest • Indentify the behaviors (operations) of interest • Object description diagram: Summarizes initial results of the two steps in a form that can be translated into a programming language 611 18200 計算機程式語言 Lecture 10-43 國立臺灣大學生物機電系 Representing Problems with Models Object: A coin Attributes: Side (head or tail) Behavior: Landing with heads up or tails up Figure 10.2 An initial object diagram 611 18200 計算機程式語言 Lecture 10-44 國立臺灣大學生物機電系 Representing Problems with Models • Unified Modeling Language (UML) is a widely accepted technique for developing object oriented programs – A program-modeling language – Uses diagrams and techniques that are easy to understand and support all the features required to implement an object-oriented design 611 18200 計算機程式語言 Lecture 10-45 國立臺灣大學生物機電系 Representing Problems with Models • Designing an object-oriented program requires understanding and specifying – The objects in the system – What can happen to these objects – When something can happen to these objects 611 18200 計算機程式語言 Lecture 10-46 國立臺灣大學生物機電系 Representing Problems with Models • UML provides seven diagram types – – – – – – – – Class Object State Sequence Activity Use case Component Deployment 611 18200 計算機程式語言 Lecture 10-47 國立臺灣大學生物機電系 Class and Object Diagrams • Class diagrams are used to describe classes and their relationships • Object diagrams are used to describe objects and their relationships • Both classes and objects are represented with a diagram consisting of a box • In class diagrams, the class name is in bold text and centered at the top of the box • In object diagrams, the object’s name is also centered at the top of the box, underlined 611 18200 計算機程式語言 Lecture 10-48 國立臺灣大學生物機電系 Class and Object Diagrams Figure 10.3 Class and object representations 611 18200 計算機程式語言 Lecture 10-49 國立臺灣大學生物機電系 Class and Object Diagrams Figure 10.5 Including attributes in UML class and object diagrams 611 18200 計算機程式語言 Lecture 10-50 國立臺灣大學生物機電系 Class and Object Diagrams • Visibility defines where an attribute can be seen – Private • Can be used on in its defining class • Cannot be accessed by other classes directly • Indicated by a minus (-) sign in front of attribute name – Public • Used in any other class • Indicated by a plus (+) sign in front of attribute name – Protected • Available to derived classes • Neither plus nor minus sign in front of attribute name 611 18200 計算機程式語言 Lecture 10-51 國立臺灣大學生物機電系 Class and Object Diagrams Figure 10.6 A class with attributes 611 18200 計算機程式語言 Lecture 10-52 國立臺灣大學生物機電系 Class and Object Diagrams • Operations are transformations that can be applied to attributes and are coded as C++ functions • Operation names are listed below attributes and separated from them by a line 611 18200 計算機程式語言 Lecture 10-53 國立臺灣大學生物機電系 Class and Object Diagrams Figure 10.7 Including operations in class diagrams 611 18200 計算機程式語言 Lecture 10-54 國立臺灣大學生物機電系 Relationships • In addition to describing classes and objects, UML class and object diagrams show the relationships between classes and/or objects • Associations between classes are typically signified by phrases such as “is related to,” “is associated with,” “has a,” “is employed by,” “works for”, and others • Relationship is indicated by a straight line connecting two classes or objects • Multiplicity: Idea of “zero-or-more” is indicated by the * symbol 611 18200 計算機程式語言 Lecture 10-55 國立臺灣大學生物機電系 Relationships Figure 10.8 An association 611 18200 計算機程式語言 Lecture 10-56 國立臺灣大學生物機電系 Relationships Table 10.2 UML Association Notation 611 18200 計算機程式語言 Lecture 10-57 國立臺灣大學生物機電系 Relationships • An aggregation is a type of association in which one class or object, referred to as the whole element, “consists of” or “is composed of” other classes or objects Figure 10.9 Single-level aggregation 611 18200 計算機程式語言 Lecture 10-58 國立臺灣大學生物機電系 Relationships • The hollow diamond symbol indicates that the parts can still exist independent of the whole to which they belong • A solid diamond symbol indicates that the component parts are intrinsic members of the whole • Inheritance is a relationship between a class and a derived version of the class 611 18200 計算機程式語言 Lecture 10-59 國立臺灣大學生物機電系 Relationships Figure 10.10 Another single-level aggregation 611 18200 計算機程式語言 Lecture 10-60 國立臺灣大學生物機電系 Common Programming Errors • Failing to terminate class declaration section with semicolon • Including return type with constructor’s prototype or failing to include return type with other functions’ prototypes • Using same name for a data member as for a member function • Defining more than one default constructor • Forgetting to include class name and scope operator, ::, in the function header 611 18200 計算機程式語言 Lecture 10-61 國立臺灣大學生物機電系 Summary • A class – Is a programmer-defined data type – Consists of a declaration and implementation section • Class functions can be written inline or included in the class implementation section • A constructor function is a special function that is called automatically each time an object is declared – If no constructor is declared, compiler supplies a default 611 18200 計算機程式語言 Lecture 10-62 國立臺灣大學生物機電系 Summary • Default constructor is the term for any constructor that does not require arguments – Each class can have only one default constructor • Objects are created by using a C++ or C style declaration: className list-of-objectNames (list of initializers); • Constructors can be overloaded – If a constructor is defined for a class, a user-defined default constructor should also be written, as compiler will not provide one 611 18200 計算機程式語言 Lecture 10-63 國立臺灣大學生物機電系 Summary • A destructor function is called each time an object goes out of scope • Destructors have the same name as their class, but preceded with a tilde (~) • There is only one destructor per class • Destructor takes no arguments and returns no value • If a user-defined destructor is not included in a class, compiler provides a do-nothing destructor 611 18200 計算機程式語言 Lecture 10-64 國立臺灣大學生物機電系