SFU CMPT Topic: Classes

Similar documents
SFU CMPT Topic: Class Templates

SFU CMPT Topic: Has-a Relationship

Cpt S 122 Data Structures. Introduction to C++ Part II

Short Notes of CS201

CS201 - Introduction to Programming Glossary By

PIC 10A Objects/Classes

Fast Introduction to Object Oriented Programming and C++

Introduction Of Classes ( OOPS )

III. Classes (Chap. 3)

Starting Savitch Chapter 10. A class is a data type whose variables are objects. Some pre-defined classes in C++ include int,

Module Operator Overloading and Type Conversion. Table of Contents

Absolute C++ Walter Savitch

AN OVERVIEW OF C++ 1

Come and join us at WebLyceum

Ch 2 ADTs and C++ Classes

Distributed Real-Time Control Systems. Lecture 17 C++ Programming Intro to C++ Objects and Classes

Fundamentals of Programming. Lecture 19 Hamed Rasifard

Object-Oriented Programming

Abstract Data Types (ADTs) 1. Legal Values. Client Code for Rational ADT. ADT Design. CS 247: Software Engineering Principles

Object-Oriented Programming in C++

Programming 2. Object Oriented Programming. Daniel POP

SFU CMPT Topic: Compound Types

C++ Constructor Insanity

CS 247: Software Engineering Principles. ADT Design

Lecture 7. Log into Linux New documents posted to course webpage

Data Structures using OOP C++ Lecture 3

Operator overloading: extra examples

Abstract Data Types (ADT) and C++ Classes

Object Oriented Programming COP3330 / CGS5409

Operator overloading

Lecture 8. Xiaoguang Wang. February 13th, 2014 STAT 598W. (STAT 598W) Lecture 8 1 / 47

A A B U n i v e r s i t y

CHAPTER 4 FUNCTIONS. 4.1 Introduction

Interview Questions of C++

CSE 374 Programming Concepts & Tools. Hal Perkins Fall 2015 Lecture 19 Introduction to C++

Introduction to C++ Systems Programming

OBJECT ORIENTED PROGRAMMING USING C++ CSCI Object Oriented Analysis and Design By Manali Torpe

Classes and Objects. Class scope: - private members are only accessible by the class methods.

EL2310 Scientific Programming

Object Oriented Design

Classes - 2. Data Processing Course, I. Hrivnacova, IPN Orsay

Paytm Programming Sample paper: 1) A copy constructor is called. a. when an object is returned by value

A Deeper Look at Classes

An Introduction to C++

Function Declarations. Reference and Pointer Pitfalls. Overloaded Functions. Default Arguments

A <Basic> C++ Course

A <Basic> C++ Course

2 ADT Programming User-defined abstract data types

Preview 9/20/2017. Object Oriented Programing with C++ Object Oriented Programing with C++ Object Oriented Programing with C++

Object-Oriented Design (OOD) and C++

CIS 190: C/C++ Programming. Classes in C++

ADTs & Classes. An introduction

SRM ARTS AND SCIENCE COLLEGE SRM NAGAR, KATTANKULATHUR

CS32 Summer Intro to Object-Oriented Programming in C++ Victor Amelkin August 12, 2013

Lecture 8: Object-Oriented Programming (OOP) EE3490E: Programming S1 2017/2018 Dr. Đào Trung Kiên Hanoi Univ. of Science and Technology

Object Oriented Design

Chapter 8. Operator Overloading, Friends, and References. Copyright 2010 Pearson Addison-Wesley. All rights reserved

CSE 303: Concepts and Tools for Software Development

CS3157: Advanced Programming. Outline

Chapter 10 Introduction to Classes

Review: C++ Basic Concepts. Dr. Yingwu Zhu

CSE 374 Programming Concepts & Tools. Hal Perkins Spring 2010

Introduction to Computers and C++ Programming p. 1 Computer Systems p. 2 Hardware p. 2 Software p. 7 High-Level Languages p. 8 Compilers p.

Instantiation of Template class

G52CPP C++ Programming Lecture 9

G52CPP C++ Programming Lecture 13

More About Classes. Gaddis Ch. 14, CS 2308 :: Fall 2015 Molly O'Neil

Implementing an ADT with a Class

CS24 Week 3 Lecture 1

Jayaram college of Engineering and Technology, Pagalavadi. CS2203 Object Oriented Programming Question Bank Prepared By: S.Gopalakrishnan, Lecturer/IT

Lecture 18 Tao Wang 1

Outline. User-dened types Categories. Constructors. Constructors. 4. Classes. Concrete classes. Default constructor. Default constructor

CSI33 Data Structures

CSE 333. Lecture 10 - references, const, classes. Hal Perkins Paul G. Allen School of Computer Science & Engineering University of Washington

Object-Oriented Programming for Scientific Computing

STUDY NOTES UNIT 1 - INTRODUCTION TO OBJECT ORIENTED PROGRAMMING

QUIZ How do we implement run-time constants and. compile-time constants inside classes?

pointers & references

Chapter 2. Procedural Programming

Object Oriented Programming. Assistant Lecture Omar Al Khayat 2 nd Year

Part VII. Object-Oriented Programming. Philip Blakely (LSC) C++ Introduction 194 / 370

Chapter 15 - C++ As A "Better C"

JAYARAM COLLEGE OF ENGINEERING AND TECHNOLOGY Pagalavadi, Tiruchirappalli (An approved by AICTE and Affiliated to Anna University)

CE221 Programming in C++ Part 1 Introduction

KOM3191 Object Oriented Programming Dr Muharrem Mercimek OPERATOR OVERLOADING. KOM3191 Object-Oriented Programming

C++ Mini-Course. Part 1: Mechanics Part 2: Basics Part 3: References Part 4: Const Part 5: Inheritance Part 6: Libraries Part 7: Conclusion. C Rulez!

Programming Fundamentals. With C++ Variable Declaration, Evaluation and Assignment 1

cs3157: c++ lecture #2 (mon-11-apr-2005) chronology of some programming languages... C++ vs Java identifiers.

EL2310 Scientific Programming

beginslide Chapter 6 The C++ Programming Language The Role of Classes

Classes Ch

COMP322 - Introduction to C++ Lecture 02 - Basics of C++

C++ Review. CptS 223 Advanced Data Structures. Larry Holder School of Electrical Engineering and Computer Science Washington State University

Chapter 9 Classes : A Deeper Look, Part 1

Appendix. Grammar. A.1 Introduction. A.2 Keywords. There is no worse danger for a teacher than to teach words instead of things.

CS304 Object Oriented Programming Final Term

CPSC 427: Object-Oriented Programming

Abstraction in Software Development

From Java to C++ From Java to C++ CSE250 Lecture Notes Weeks 1 2, part of 3. Kenneth W. Regan University at Buffalo (SUNY) September 10, 2009

Welcome Back. CSCI 262 Data Structures. Hello, Let s Review. Hello, Let s Review. How to Review 8/19/ Review. Here s a simple C++ program:

Transcription:

SFU CMPT-212 2008-1 1 Topic: Classes SFU CMPT-212 2008-1 Topic: Classes Ján Maňuch E-mail: jmanuch@sfu.ca Friday 15 th February, 2008

SFU CMPT-212 2008-1 2 Topic: Classes Encapsulation Using global variables can save you passing data to functions they can easily access all data they need. However, it makes program unreadable and unreliable data can be modified in unwanted manner. It s recommended to protect data from unnecessary access, i.e., pass to functions only the necessary data, and avoid using of global variables. In fact OOP dictates to completely hide data and provide only interface (functions) to access and modify the data (the user of the interface doesn t need to know how the data are actually stored in memory). called encapsulation, one of the main principles of OOP design. Hiding implementation details and providing only the interface is

SFU CMPT-212 2008-1 3 Topic: Classes C solution: header files The code is split to several units where each unit groups related functions (e.g., iostream groups input/output functions together). Each unit has a header and a source code file. Typically, constants, structure, template and class declarations; a header file contains all declarations: function prototypes, definitions of the functions declared in the header file; to each header file is assigned a source code file containing the the source code file could contain some global variables used for implementation of the function in it; and those are in some sense protected (only accessible in this source file) the functions declared in header file(s). there is also a source code file containing the main function using Example: coordin.h, coordin.cpp, main.cpp [Prata]

SFU CMPT-212 2008-1 4 Topic: Classes Separate compilation to use the functions from other header files compiler generates object.o files only needs function prototypes linker generates final executable file needs function definitions each function is in the final executable file exactly once (unless inline) Separate object code is generated for each source file. All object files generated during compilation and library files are joined together into the final executable during linking. Question: why is it useful to split the code to several files?

SFU CMPT-212 2008-1 5 Topic: Classes Preprocessor file inclusion (#include) Examples: 1 #include <iostream> // look in system directories 2 #include "coordin.h" // look in the local directory macro definitions (#define) Examples: 1 #define PI 3.14 // replace every occurrence of the 2 // string "PI" with the string "3.14" in the source 3 // file before compilations starts 4 #define COORDIN_H_ // defines "COORDIN_H_" macro definition can use arguments: 1 #define SWAP(a,b,type) { type temp=a; a=b; b=temp; } Example: swap6.cpp

SFU CMPT-212 2008-1 6 Topic: Classes conditional statements (#ifdef... or #if defined..., #ifndef... or #if not defined...) Example: 1 #ifndef COORDIN_H_ 2... code... 3 #endif

SFU CMPT-212 2008-1 7 Topic: Classes Classes and objects C solution to encapsulation is not sufficient. Example. I want to use two stacks in my program. Either I would have to have two header/source code files, one for each stack (repeating the code), or one stack can (unintentionally) access data of the other. C++ provides a better solution: classes: represent abstraction of real objects class is a new user-defined type, and objects are variables of that type a type is described by two things: how much memory is needed to store it what operations can be performed on a variable of that type collection of such operations is called interface Note. usually, we manipulate with data through the operations of the interface, not directly with bits representing the data in memory

SFU CMPT-212 2008-1 8 Topic: Classes Class specification A class specification has two parts: a class declaration describes data (data members) and interface (prototypes of member functions (also called methods)) [in a header file] [in the corresponding source code file] the class method definitions implementation of member functions

SFU CMPT-212 2008-1 9 Topic: Classes Example of a class declaration: 1 class Date { 2 private: 3 int day, month, year; // data members 4 bool incr_day(); 5 public: 6 void set(int, int, int); 7 void get(int &, int &, int &); 8 void next(); 9 void print(); 10 }; Date is a new type 1 Date d; declares a variable d of type Date, usually called object

SFU CMPT-212 2008-1 10 Topic: Classes later in the course) describe access control for class members: private members (data and methods) can be accessed only by methods of the class keywords private and public (and also protected discussed 1 d.day=10; // compiler error 2 d.incr_day(); // compiler error public members (data and methods) can be accessed from outside of the class 1 d.set(5,10,2005); // ok Example: cout is an object of class ostream ostream contains public methods get() and getline(), hence we can call them in the program using the membership operator (. ): 1 cout.get();

SFU CMPT-212 2008-1 11 Topic: Classes Encapsulation with classes data and auxiliary functions are declared private: data hiding interface is declared public: hiding implementation details from the user of the class client / server model: the class is a server the user of the class is a client uses the server through a public interface the server and the client can modify (improve) their code independently (as long as they both follow the agreed interface)

SFU CMPT-212 2008-1 12 Topic: Classes Class methods definitions to identify that a function f belongs to class X, we have to use the scope operator :: 1 void X::f(int a) { 2 // code 3 } Example: 1 void Date::set(int d, int m, int y) { 2 day = d; 3 month = m; 4 year = y; 5 } members of class have a class scope; private members (day, month and year) can be accessed only in member functions of the class (Date::set()) as they are in the same (class) scope! Complete example: date1.cpp

SFU CMPT-212 2008-1 13 Topic: Classes Using a class 1 Date d; (similarly as variables of type structure) creates an object d having its own copy of data members of its class all objects of the same class share one copy of each method the membership operator. can be used to access data members and methods 1 d.set(5,2,2004); using a method set() on d will call function Date::set() using data members of d Example: date1.cpp

SFU CMPT-212 2008-1 14 Topic: Classes Note. A class (e.g. Date) can be used in a similar way as any built-in type: Date today; Date *p = new Date; void f(date &d); Date d, today; d = today; memberwise assignment cout, cin can be taught to print and read an object of our class

SFU CMPT-212 2008-1 15 Topic: Classes Sample questions Why is it recommended to prefer local declarations of variables to global declarations? What are the advantages of splitting C++ program to several files? What are the value of i and j after performing the following code: 1 #define SWAP(a,b,type) { type tmp=a; a=b; b=tmp; } 2 int i=1,j=2; 3 SWAP(++i,j,int) What is encapsulation? How is it useful? How it can be achieved for classes? What is the difference between private and public data member of a class?

SFU CMPT-212 2008-1 16 Topic: Classes Object initialization Constructor Examples of initializing: int a=3; long b[4]={2l, 3L, 5L, -1L}; struct Point { int x,y; } p={1,1}; Question: How to initialize an object? 1 Date d={7,10,2005}; // compiler error: 2 // accessing private members Answer: use constructor to initialize an object 1 class X { 2 public: 3 X(argument_list1); 4 X(argument_list2); 5 };

SFU CMPT-212 2008-1 17 Topic: Classes Example: 1 class Date { 2 int day, month, year; 3 public: 4 Date(int d, int m, int y); // constructor declaration 5 //... 6 }; 7 8 Date::Date(int d, int m, int y) 9 { 10 day = d; month = m; year = y; 11 } // constructor definition

SFU CMPT-212 2008-1 18 Topic: Classes Calling a constructor (initializing an object) explicitly: 1 Date d = Date(5,2,2004); implicitly: 1 Date d(5,2,2004); dynamic memory allocation: 1 Date *pdate = new Date(5,2,2004); (allocates space for one object of type Date and initializes its values using the constructor Date(int,int,int)) Remark: Each time an object is declared/allocated, the constructor is automatically called! Question: Which constructor is called when an object is declared/allocated without calling a constructor (Date d;)?

SFU CMPT-212 2008-1 19 Topic: Classes The default constructor (with no arguments) if no constructor is defined, the compiler automatically provides a default constructor: 1 X::X() {} // default constructor for class X having no arguments and doing nothing calling the default constructor: explicitly: 1 Date d = Date(); implicitly: 1 Date d; 2 Date d(); // compiler error! dynamic memory allocation: 1 Date *pdate = new Date;

SFU CMPT-212 2008-1 20 Topic: Classes if there is a user-defined constructor, the default constructor is not provided: 1 Date d; // tries to call the default constructor 2 // - a compiler error it s a good idea to provide the default constructor Question: Why? Date d; to declare arrays of objects 1 Date d[10]; // compiler error: 2 // wants to call default constructor (10 times) 3 Date *p=new Date[10]; // compiler error again members to a meaningful default value it s a good idea to make the default constructor to initialize data Example: date2.cpp Remark: Constructor Date(int d=7,int m=10,int y=2005); provides also the default constructor.

SFU CMPT-212 2008-1 21 Topic: Classes Destructor when the object seize exists, the destructor is automatically called! 1 class X { 2 public: 3 X(); 4 }; no arguments! hence, there can be only one destructor if no defined, it s provided automatically by compiler: 1 X:: X() {} // do nothing Question: When is called? automatic storage object: when the program exists the block static storage object: when program terminates dynamic storage object: when delete is called Example: date3.cpp

SFU CMPT-212 2008-1 22 Topic: Classes Question: What is the use of the destructor? to clean-up after we finish using an object Example: 1 class intarray { 2 int *data; 3 int size; 4 public: 5 intarray(int s); 6 intarray(); // destructor 7 }; 8 9 intarray::intarray(int s) { 10 size = s; 11 data = new int[size]; 12 } 13 intarray:: intarray() { 14 delete [] data; 15 };

SFU CMPT-212 2008-1 23 Topic: Classes const methods Example: 1 const Date d = Date(5,2,2004); 2 d.set(1,1,1888); // compiler error 3 d.print(); // also a compiler error Q: How to specify that the member function doesn t modify the object? Example: 1 class Date { 2... 3 void print() const; 4 }; 5 void Date::print() const 6 {... } Example: date4.cpp Remark: All accessor methods should be defined as const!

SFU CMPT-212 2008-1 24 Topic: Classes The this pointer each class method is passed a hidden parameter 1 X * const this; a const pointer to the object on which the method was invoked Example: 1 class X { 2 int m; 3 public: 4 int value(); 5 }; 6 7 int X::value() { return m; } // is equivalent to 8 int X::value() { return this->m; }

SFU CMPT-212 2008-1 25 Topic: Classes Question: What for is the this pointer? Example: cin.get(char [],int) function returns a reference to cin which allows chaining the calls: 1 cin.get(buffer,max_size) >>ch; reference to the object representing more recent date: Q. Define a member function later(date &) which returns a 1 class Date { 2 //... 3 Date &later(date &d); 4 }; If the object on which the function later() was invoked is more recent, we can use *this to get the reference to this object.

SFU CMPT-212 2008-1 26 Topic: Classes 1 Date &Date::later(Date &d) 2 { 3 if (year>d.year 4 year==d.year && 5 (month>d.month 6 month==d.month && day>d.day)) 7 return *this; 8 else 9 return d; 10 } 11 12 // example of use: 13 Date today; 14 Date thanksgiving(10,10,2005); 15 today.later(thanksgiving).print();

SFU CMPT-212 2008-1 27 Topic: Classes Class inline functions Member functions can be defined directly in the class declaration: 1 class Point { 2 private: 3 int x,y; 4 public: 5 Point(int ix,int iy) { x=ix; y=iy; } 6 void move(int mx,int my) { x+=mx; y+=my; } 7 int getx() const { return x; } 8 int gety() const { return y; } 9 }; used only for functions with short code) They are automatically declared as inline functions! (should be

SFU CMPT-212 2008-1 28 Topic: Classes Static members of class declared with the keyword static can be both data members and member functions: 1. data members: there is only one copy of a variable or a constant for the whole class Examples: 1 // in header file: 2 class X { 3 private: 4 static const int MAX=100; // only const integer types 5 // can be initialized directly in the class declaration 6 static int nobjects; 7 }; 8 9 // in source code file: 10 int X::nobjects=0; // initialization Example: date5.cpp

SFU CMPT-212 2008-1 29 Topic: Classes 2. member functions: doesn t have access to any particular object µ can only access static members of class can be also called using the class name (not through the object) of course, only if it declared in public section Example: 1 class X { 2... 3 public: 4 static int numobjects(); 5 }; 6 // in source code file: 7 int X::numObjects() { return nobjects; } 8 // in main file: 9 cout << X::numObjects(); Example: date6.cpp

SFU CMPT-212 2008-1 30 Topic: Classes Sample questions Consider a class Int with a unary constructor: 1 class Int { 2 int value; 3 public: 4 Int(int v) { value=v; } 5 }; Show 3 different ways of how to create an object of type Int with value 10. Give a short description for each of them. (There is another way, see the next Sample questions.) What is the default constructor? When is the default constructor provided for a class by the compiler? Why is it useful to define the default constructor?

SFU CMPT-212 2008-1 31 Topic: Classes What is the output of the following program? 1 #include <iostream> 2 using namespace std; 3 4 class Int { 5 int value; 6 public: 7 Int(int v) { value=v; } 8 Int() { cout << value << endl; } 9 }; 10 11 Int a(1); 12 13 int main() { 14 Int b(2); 15 Int *c = new Int(3); 16 { 17 Int d(4); 18 } 19 delete c; 20 return 0; 21 }

SFU CMPT-212 2008-1 32 Topic: Classes What s wrong with the following code? 1 class Int { 2 int value; 3 public: 4 Int(int v) { value=v; } 5 int get() { return value; } 6 }; 7 8 int main() 9 { 10 const Int i(10); 11 cout <<i.get(); 12 } What is this pointer? Show an example when you need to use this pointer. How would you count the number of existing objects of a class X? How would you count the total number of all objects of type X declared/allocated?

SFU CMPT-212 2008-1 33 Topic: Classes User-defined type conversions unary constructors provide automatic conversions to the class type Example: 1 class Date { 2 //... 3 public: 4 Date(int d=0, int m=0, int y=0); // constructor 5 // zero values will initialize to current date 6 // also provides a unary constructor Date(int) 7 //... 8 }; The following statements are equivalent: 1 Date d=10; // implicit conversion 2 Date d=date(10); // explicit conversion 3 Date d=(date)10; // explicit conversion Example: date7.cpp

SFU CMPT-212 2008-1 34 Topic: Classes implicit conversions are sometimes confusing; is there a way how to forbid them? YES use the keyword explicit in declaration of the constructor! 1 class Int { 2 int i; 3 public: 4 explicit Int(int ii) { i=ii; } // unary constructor 5 }; 6... 7 Int number=10; // compiler error: 8 // implicit conversion not allowed 9 Int number=int(10); // ok 10 Int number=(int) 10; // ok two-step conversion: 1 Date d=12.33; // ok: 2 conversions at most one user-defined conversion works only if there is an unambiguous choice

SFU CMPT-212 2008-1 35 Topic: Classes 1 class Int { 2 int i; 3 public: 4 Int(int ii) { i=ii; } // unary constructor 5 }; when is implicit conversion used? initialization: Int x=10; assignment: x=12; passing int to a function expecting Int (by value or const reference) 1 void f(const Int&); 2... 3 f(10); //ok when returning int in function with return value of type Int (by value or const reference)

SFU CMPT-212 2008-1 36 Topic: Classes how about converting from the class type to other type (basic type, or to the class type which declaration we cannot modify)? use conversion functions! Example (converting to the class type): 1 class Time { 2 private: 3 int hours,minutes; 4 public: 5 Time(int m=0,int h=0) { 6 minutes = m % 60; 7 hours = h + m/ 60; 8 } 9 }; now, we can convert int (minutes) to Time: 1 Time t=123; // t={2,3} Question: how to convert Time to int?

SFU CMPT-212 2008-1 37 Topic: Classes 1 class Time { 2... 3 operator int(); // conversion function 4... 5 }; 6... 7 Time::operator int() { 8 return 60*hours+minutes; 9 } now, we can convert Time to int: 1 Time t(10,2); // 2 hours, 10 minutes 2 int i=(int) t; // explicit conversion: i=130 3 int j=int(t); // explicit conversion: j=130 4 int k=t; // implicit conversion: k=130 syntax: 1 operator type_name(); Example: time1.cpp

SFU CMPT-212 2008-1 38 Topic: Classes Friend member functions have access to private members of the class are not member functions defined in the same scope as the class (not inside of the class) Example: 1 class X { 2 private: 3 int a; 4 void modify() { a += 2; } 5 public: 6 X(int i) { a=i; } 7 friend void f(int,x &); 8 };

SFU CMPT-212 2008-1 39 Topic: Classes 1 void f(int i, X &x) { 2 x.modify(); // we can access private member function 3 cout <<i*x.a; // we can access private data member 4 } 5 6 // in the program: 7 X x(3); 8 f(10,x); // prints 50 9 x.f(10,x); // compiler error: 10 // f is not a member function! Remarks. friend functions does not violate data hiding: friend function to a class X can be only declared in the class X they are just different mechanism for expressing class interface

SFU CMPT-212 2008-1 40 Topic: Classes Sample questions Consider a class Int with a unary constructor: 1 class Int { 2 int value; 3 public: 4 Int(int v) { value=v; } 5 }; Show 5 different ways of how to create an object of type Int with value 10. Give a short description for each of them. Consider a class Point: 1 class Point { 2 int x,y; 3 public: 4 Point() { x=0; y=0; } 5 Point(int nx, int ny) { x=nx; y=ny; } 6 int getx() const { return x; } 7 int gety() const { return y; } 8 };

SFU CMPT-212 2008-1 41 Topic: Classes Enhance the class with methods allowing conversions from an int value and to a double value, where: 1. an int value v is converted to a point (v,0); 2. a point is converted to a double value representing its distance from the origin (that is from point (0,0)). Example: 1 Point p1=1; 2 cout <<p1.getx()<<" "<<p1.gety()<<endl; // prints "1 0" 3 Point p2(1,1); 4 double d=p2; 5 cout d<<endl; // prints 1.41 (square root of 2) Hint: You can use a cmath function with prototype double sqrt(double); returning square root of the argument.